对于synchronized加锁原理的理解

从底层来讲的话,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)(仅仅是一些简单的理解,希望大家指正)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值