Java锁机制(Synchronized)
Java锁机制(Synchronized)
JVM内存结构
在了解Java锁机制前,先来复习一下JVM的内存结构
对象、对象头、结构
Java的对象包含了三个部分:对象头、实例数据、对齐填充字节。
-
对齐填充字节是为了满足Java对象的大小必须是8bit的倍数这一条件而设计的。
-
实例数据就是在你初始化对象时,设定的属性和状态的内容(属性和方法)。
-
对象头存放了一些对象本身运行时的信息,对象头包含了两部分:Mark Word和Class Pointer。相较于实例数据,对象头属于一些二外的存储开销,所以它被设计的极小,来提高效率。
- Class Pointer就是一个指针,它指向了当前对象类型所在的方法区中的类型数据。
- Mark Word存储了很多和当前对象运行时锁状态有关的数据(重点)
通过这张表我们可以看到Mark Word只有32bit,并且它是非结构化的。这样在不同的锁标志位下,不同的字段而已重用不同的比特位,因此达到节省空间的作用。
我们先关注Mark Word的最后两位,这两位代表了锁标志位,分别对应着:无锁、偏向锁、轻量级锁、重量级锁这四种状态。
Synchronized
大家都知道在Java中synchronized关键字可以用来同步线程。synchronized被编译后会生成monitorenter和monitorexit两个字节码指令,依赖这两个字节码指令来进行线程同步。
我们写一段验证代码
public class TestSync {
private int num=0;
public void test(){
for(int i