二、synchronized原理详解

一、JMM模型与volatile详解
二、synchronized原理详解
三、AQS框架详解——AbstractQueuedSynchronizer
四、ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue和DelayQueue学习总结
五、CountDownLatch、CyclicBarrier和Semaphore的比较
java中interruptor理解与使用
Java线程的6种状态及切换
MESI协议:保证可见性,无法保证原子性

synchronized是一种内置锁,是可重入的。

1、用法

(1)放在实例方法上,锁住的当前实例对象;
(2)放在类方法上,锁住的是当前类;
(3)放在同步代码块中,锁住的是括号里面的对象。

2、底层原理

JVM层面:通过内部对象Monitor实现,基于进入和退出monitor对象实现方法和代码的块的同步;
java代码使用了synchronized修饰符之后,编译为字节码时,会称为下图的形式。

二、synchronized原理详解_第1张图片
任何一个对象有且只有一个Monitor与之关联,当一个对象的monitor被持有之后,它就处于锁定状态,其他人只能等待;同一个线程再次进入,monitor增加1;这个与AQS框架中的state状态量很类似。

线程A通过monitorenter获取对象锁,执行业务代码,通过monitorexit释放锁,第二个monitorexit为发生异常时退出锁的处理逻辑。

操作系统层面:monitor的实现依赖操作系统层面的Mutex Lock指令;

3、对象的内存布局——锁状态标记

Monitor对象存在于Java对象的对象头Mark Word中,synchronized锁便可以通过这种方式获取锁。
对象的内存布局:

二、synchronized原理详解_第2张图片
面试题:object = new obejct()占用了多少字节?
以64位操作系统为例:
Mark Word占用了8个字节,Class Pointer默认开始指针压缩占用了4个字节,最终要被8整除,对齐补充4个字节;最终占用16个字节,算上object指针,压缩后占用的4个字节,答案是20个字节。

Mark Word:用于存储对象自身的运行时数据,如hashcode,GC分代年龄,锁标志位等;
二、synchronized原理详解_第3张图片

4、锁的膨胀升级过程

锁的四种状态:无锁、偏向锁、轻量级锁和重量级锁。
无锁(new 对象)——偏向锁(自旋锁、自适应自旋)——轻量级锁——重量级锁
(1)刚刚new出来的对象是处于无锁状态;
(2)如果有线程过来,直接就变成了偏向锁,mark word中也会记录一个线程ID
(3)如果处于偏向锁的状态下,如果发生线程竞争,就会升级为轻量级锁,mark word中也会记录一个Lock Record指向栈中的线程;
(4)如果竞争激烈,锁就会升级重量级锁, 这是操作系统级别的锁,mark word也会指向操作系统中锁的位置

5、锁消除

java虚拟机在JIT编译时,通过扫描运行时上下文,去除不可能存在共享资源竞争的锁。锁消除的依据是逃逸分析

6、锁的粗化

频繁的加了一些粒度过细的锁,jvm避免频繁的加锁/解锁,会对代码进行优化,减少加锁和解锁的频率。

你可能感兴趣的:(Java并发编程,java,jvm,多线程,mark,word,synchronized)