Java程序员必会Synchronized底层原理剖析( 二 )


Java程序员必会Synchronized底层原理剖析

文章插图
图上展示了ObjectMonitor的基本工作机制:
  1. 当多个线程同时访问一段同步代码时,首先会进入 _EntryList 队列中等待 。
  2. 当某个线程获取到对象的Monitor锁后进入临界区域,并把Monitor中的 _owner 变量设置为当前线程,同时Monitor中的计数器 _count 加1 。即获得对象锁 。
  3. 若持有Monitor的线程调用 wait() 方法,将释放当前持有的Monitor锁,_owner变量恢复为null,_count减1,同时该线程进入 _WaitSet 集合中等待被唤醒 。
  4. 在_WaitSet 集合中的线程会被再次放到_EntryList 队列中,重新竞争获取锁 。
  5. 若当前线程执行完毕也将释放Monitor并复位变量的值,以便其他线程进入获取锁 。
线程争抢锁的过程要比上面展示得更加复杂 。除了_EntryList 这个双向链表用来保存竞争的线程,ObjectMonitor中还有另外一个单向链表 _cxq,由两个队列来共同管理并发的线程 。
Java程序员必会Synchronized底层原理剖析

文章插图
下篇再讲一下Synchronized锁优化的过程 。
我是「一灯架构」,如果本文对你有帮助,欢迎各位小伙伴点赞、评论和关注,感谢各位老铁,我们下期见

Java程序员必会Synchronized底层原理剖析

文章插图

经验总结扩展阅读