1 ReentryLock实现了Lock接口,并且构造方法中初始化内部同步器

讯享网
根据Syn的类别不同加锁步骤也有些不一样,
1非公平锁,如下

直接尝试获取锁,获取成功则把当前线程设为锁的拥有者,否则进行acquire
2公平锁

3acquire方法


tryAcquire方法也很简单,就是判断当前同步器是否可用,
1如果是非公平锁,则直接进行尝试获取锁
2如果是公平锁要确保,当前等待队列没有线程,则在进行获取
3获取锁失败,这判断当前显示是否已经拥有锁,如果已经拥有,则增加
4否则返回false;
addWiter()方法

该方法简单易懂,直接在用CAS在队尾添加元素,如果添加失败,则调用enq方法,循环CAS添加到队尾 PS(这个队列是懒加载的,即当使用时才会对head和tail进行初始化,所以要加if判断)

acquireQueued()方法

1本方法也很直接,先检查当前线程是否是头结点,如果是则尝试获取,获取成功,则返回失败
2进入should 方法改变pre结点的状态,为了多自选一次,
3第二次自选还是失败的话就会进入阻塞,
unlock方法,调用release方法.


方法就是先尝试把当前线程的计数器减1,然后返回
如果state==0,则表明当前锁已经被释放,尝试唤醒队列中的第一个有效线程.
Condition内部类

内部也是一样维护着一个双向链表实现的队列

向等待队列中添加一个元素

流程很简单,就是把等待队列的元素断开,并放到同步器队列当中去,竞争锁。

await方法
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/37300.html