Synchronized(实现原理/锁膨胀/锁升级)
2021-03-02 16:16:31 0 举报
AI智能生成
Synchronized(实现原理/锁膨胀/锁升级)
作者其他创作
大纲/内容
阅读导航
线程 👉
CPU+JMM 👉
CAS+Volatile 👉
Synchronized
JUC 👉
线程池 👉
ThreadLocal 👉
Synchronized
锁类型
可冲入锁:同一个线程可以多次获取同一把锁,不会因为之前已经获取过还没释放而阻塞
非公平锁:请求资源的线程在进入ContentionList前先尝试自旋获取锁,获取不到再排队
作用范围
静态方法
锁对象是类对象(class)
成员方法
锁对象是当前对象this
代码块
括号中指定的对象
monitorenter、monitorexit、程序计数器
实现原理
Synchronized 是通过对象内部的 monitor (监视器锁)来实现的(monitorenter|monitorexit)
monitor本质又依赖于底层操作系统的 Mutex Lock(互斥锁)
如果monitor的计数器为0,则线程占有monitor,然后将计数器设置为1,该线程即为monitor的所有者,
如果当前线程已经占有monitor,只是重新进入,则monitor的计数器加1;执行monitorexit时计数器减1,
如果其他线程已经占用了monitor,则当前线程进入阻塞状态,直到monitor的进入数为0再尝试获取
如果当前线程已经占有monitor,只是重新进入,则monitor的计数器加1;执行monitorexit时计数器减1,
如果其他线程已经占用了monitor,则当前线程进入阻塞状态,直到monitor的进入数为0再尝试获取
锁升级/膨胀
1.6以后Synchronized进行了优化(无锁→偏向锁→轻量级锁→重量级锁)
只能升不能降(四种状态)
循环等待的锁就是轻量级锁:消耗CPU资源
拥有等待队列的锁就是重量级锁:不消耗CPU
详细过程 👉
为什么要引入偏向锁?
并发度很低的情况下,同一个线程可直接获取锁,避免轻量级锁内存拷贝的麻烦
如果确定竞态资源会被高并发的访问,建议通过-XX:-UseBiasedLocking参数关闭偏向锁
为什么要引入自旋锁?
自旋锁不会让线程阻塞,避免线程在操作系统用户态和内核态的切换,提升效率
关于作者
我的博客 👉
微信公众号 👉
GitHub 导航 👉
ProcessOn 主页 👉
0 条评论
下一页