
简介
该用户还未填写简介
擅长的技术栈
可提供的服务
暂无可提供的服务
下一步是 CAS,这里的 CAS 涉及到这几个操作数:对象 MarkWord 的内存地址,期望的处于无锁状态的 MarkWord,指向自身锁记录的指针。如果操作成功,线程要将锁记录中的 owner 指针指向锁对象,这样在释放锁的时候才能找得到锁对象,接下来线程就可以访问共享资源了。这是因为,线程在退出偏向锁时,不会撤销偏向锁,它的线程 ID 依然留在 MarkWord 中,不会置为 NULL,除非

事实上,Java 有且仅有一种方式可以真正创建出线程,那就是通过调用 Thread 类中的start()方法。因为只有这个方法会去真正调用 JVM 本地方法,进而进行操作系统创建线程的系统调用,并让 Java 线程与操作系统线程产生映射关系,最后将实现了 Runnable 接口的任务传递给线程。只要线程获得了 CPU 时间片,就进入 run() 方法执行具体的代码逻辑。所以,仅仅有 start

Java 对象在堆内存中的存储布局可以分为三部分:对象头、实例数据、对齐填充。其中,对象头包含了对象在运行时所需的一些元数据,它主要由两部分组成:Mark Word:记录对象自身的运行时数据。类型指针:它指向元空间中该对象对应的类元数据(Klass 结构体),JVM 通过这个指针来判断该对象是哪个类的实例。在这里我们需要重点关注的是 Mark Word,理解它是理解 synchronize

在 Java 中,我们不能随意地中断一个线程,因为我们不清楚这个线程的运行状态,它可能持有锁,如果强行中断它可能会导致锁不能被释放的问题。或者可能正在操作数据库,强行中断可能出现数据不一致的情况。因此,Interrupt方法实际上是为目标线程设置一个中断状态,而不是真的中断其运行,目标线程的具体退出时机由其自己决定。如果目标线程处于运行状态,则不会受任何影响,只是状态被标记为中断,目标线程需调

我们之所以引入线程,是因为进程的创建和销毁过于重量,而线程可以共享更多内存资源,因此成为显著提高效率的手段。但线程也是 OS 分配的,也涉及用户态和内核态的切换,也是一种很有限的资源,其创建和销毁的开销虽然比进程小,但也不可忽视。如果想在线程的基础上,进一步提高并发编程的效率,目前有两种主流解决方案:协程:这是纯用户态的轻量级线程,由程序自己控制调度,不涉及操作系统内核切换。在 Java 中

Spring 框架倡导基于 POJO(Plain Old Java Object,简单 Java 对象) 的轻量级开发理念,立足于 POJO,为 POJO 提供服务。Spring Core 是整个 Spring 框架的基础,在该模块中,Spring 为我们提供了一个 IoC 容器的实现。IoC 是 Spring 最核心的思想,即 Inversion of Control(控制反转)。控制反转的意思

MySQL 能恢复到半个月内任意一秒的状态,这是怎么做到的?它依赖:全量备份(状态快照) + 增量备份(Binlog 重放)。

Redo Log 也称重做日志、事务日志,是 InnoDB 独有的日志形式,它的核心作用就是保证事务的持久性。只要事务提交成功,对数据库的修改就永久保存下来了,即使发生系统崩溃,数据也不会丢失。想要理解 Redo Log 的作用,首先需要明确,数据库在修改数据时,并不是每次操作都直接写入磁盘数据文件。如果每次更新都去磁盘 IO,这个效率是非常低的,因为找到一个数据页进行修改是随机磁盘 IO。为了解

Redo Log 也称重做日志、事务日志,是 InnoDB 独有的日志形式,它的核心作用就是保证事务的持久性。只要事务提交成功,对数据库的修改就永久保存下来了,即使发生系统崩溃,数据也不会丢失。想要理解 Redo Log 的作用,首先需要明确,数据库在修改数据时,并不是每次操作都直接写入磁盘数据文件。如果每次更新都去磁盘 IO,这个效率是非常低的,因为找到一个数据页进行修改是随机磁盘 IO。为了解

观察单次查询性能:使用 MySQL 提供的客户端程序 mysqlslap 进行压力测试,配置如下:使用执行计划查看 SQL 语句的执行情况,这是判断如何优化 SQL 和索引的最重要工具。EXPLAIN 返回的结果中,最重要的字段是 type,其次是 key、rows、extra。key 表示实际使用的索引,rows 表示预计需要扫描的行数。type 和 extra 会在下面重点介绍:这个字段描述了








