synchronized原理分析

用于屏蔽掉各种硬件和操作系统的内存访问差异,原理分析

Posted by Sunfy on 2021-11-17
Words 449 and Reading Time 1 Minutes
Viewed Times
Viewed Times
Visitors In Total

synchronized

应用场景: 解决线程安全问题

加锁: 序列化的访问临界资源

java中的实现 :

  • 阻塞: synchronized reentrantLock
  • 非阻塞: cas+自旋

synchronized的使用

方式: 方法上 代码块中 (锁对象)

原理

jvm指令: 方法上(acc_synchronized ) 代码块( monitorenter monitorexit)

管程(Monitor): java锁体系的设计思想,设计理论基础

MESA: 入口等待队列 (互斥) 多个条件队列 (同步 阻塞唤醒机制)

java实现monitor: Object wait/notify/notifyAll 重量级操作 : (用户态到内核态的切换)

优化: 重量级锁 偏向锁 轻量级锁

偏向锁: 不存在竞争 偏向某个线程 thread1,后续进入同步块的逻辑没有加锁解锁的开销

轻量级锁: 线程间存在轻微的竞争(线程交替执行,临界区逻辑简单) CAS获取锁,失败膨胀

重量级锁: 多线程竞争激烈的场景 膨胀期间创建一个monitor对象 CAS自旋 阻塞

加锁/解锁 加锁解锁的标记 识别是哪种锁(锁状态)

synchronized加锁加在对象上,锁对象是如何记录锁状态的?

对象的内存布局

跟踪锁状态如何变化的?

误区:

关于偏向锁轻量级锁重量级锁存在的理解误区:

  • 无锁——>偏向锁——>轻量级锁——>重量级2锁 (不存在无锁——>偏向锁)

    2.轻量级锁自旋获取锁失败,会膨胀升级为重量级锁 (轻量级锁不存在自旋)

  • 重量级锁不存在自旋 (重量级锁存在自旋 )

jvm对synchronized的优化

针对偏向锁(偏向锁撤销存在性能问题) 批量重偏向 批量撤销

针对重量级锁 : 自旋优化 自适应自旋

锁粗化, 锁消除


Copyright 2021 sunfy.top ALL Rights Reserved

...

...

00:00
00:00