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