java synchronized实现机制

看了一些不错书和文章后,整理了一幅图,用来描述jvm是如何实现synchronized关键字的linux

其中补充几点:安全

  1. jvm从偏向锁->轻量级锁->重量级锁,是锁升级过程,反之是锁降级
  2. synchronized须要用到monitor对象,也就是synchronized(obj)中的obj对象,jvm会在这个对象的头信息中进行cas操做,来标记该monitor对象的锁类型(偏向、轻量级、重量级)、持有该monitor的threadId、被持有的计数等信息
  3. 因为jvm都是基于thread来判断该monitor是否可用,因此同一个thread能够屡次加锁该monitor对象,也就是jvm支持可重入锁。后面每次重入,计数+1
  4. 在线程N进入全局安全点时,须要暂停持有偏向锁的线程M,并检查M是否存活,而后决策是升级锁仍是降级锁,避免M在执行同步块的时候,N将锁降级为无锁,致使N和M同时执行同步块
  5. 第一个线程A获取到偏向锁,第二个线程B发现有人持有锁,会将锁降级为轻量级锁,第三线程发现B咨询等待轻量级锁,就会将锁降级为重量级锁
  6. 当有多个线程频繁竞争锁时,禁用偏向锁能够优化性能
  7. 减小持有锁的时间。长时间持有锁,容易致使锁降级为重量级锁
  8. 重量级锁利用了操做系统的互斥锁,须要从用户态到内核态进行切换,开销较大
  9. jvm线程与linux内核线程一一对应
相关文章
相关标签/搜索