从底层来讲的话,synchronized加锁的原理就是利用了管程来做到一个线程安全的目的,而Java中管程的实现就是Monitor对象,Monitor这一数据结构其实我认为和AQS是非常相似的,Monitor中维护了一下几个变量
owner:指向持有ObjectMonitor对象的线程id
WaitSet:存放处于wait状态的线程队列,即调用wait()方法的线程
EntryList:存放处于等待锁block状态的线程队列
count:约为WaitSet 和 EntryList 的节点数之和
cxq: 多个线程争抢锁,会先存入这个单向链表
recursions: 记录重入次数
线程获取锁就是使用CAS来尝试将owner改为自己的线程id,成功则获取锁,若是失败就进入cxq,这里也是每一次抢的线程,而WaitSet中的线程是需要其他线程调用notify或者notify All方法之后会进入EntryList(有一定的策略,也可能进入cxq)(仅仅是一些简单的理解,希望大家指正)
对于synchronized加锁原理的理解
最新推荐文章于 2024-09-13 11:16:40 发布