网站做查赚钱邯郸市旅游景点有哪些
news/
2025/10/4 0:04:00/
文章来源:
网站做查赚钱,邯郸市旅游景点有哪些,免费ppt模板下载红色,wordpress用户角色的区别Synchronized和Reentrantlock的挂起逻辑
synchronized中有两个核心的结构
EntryList cxq#xff1a;等待拿锁的线程存储位置Waitset#xff1a;被执行wait方法的线程存储位置
流转#xff1a;
线程获取锁资源失败#xff0c;扔到EntryList cxq线程持有锁资源#x…Synchronized和Reentrantlock的挂起逻辑
synchronized中有两个核心的结构
EntryList cxq等待拿锁的线程存储位置Waitset被执行wait方法的线程存储位置
流转
线程获取锁资源失败扔到EntryList cxq线程持有锁资源执行了wait方法扔到WaitSet其他线程执行了notify/notifyAll方法WaitSet中的线程会扔到EntryList/cxq中 ReetrantLock中的Condition中支持了类似上述的功能
ReetrantLock中有两个核心的结构
AQS的同步队列等待拿锁的线程存储位置AQS内部的Condition单向链表被执行await方法的线程存储位置
流转
线程获取锁资源失败扔到同步队列线程持有锁资源执行了await方法扔到Condition单向链表其他线程执行了signal/signalAll方法WaitSet中的线程会扔到同步队列中 AQS的Condition支持 AQS是JUC包下的一个抽象类单独聊AQS没什么但是他是AQS很多JUC包下的工具类的父类
AQS有三个核心点
int类型的state属性AQS内部的同步队列Condition的单向链表
本文主要细看Condition单向链表
static final class Node {static final Node SHARED new Node();static final Node EXCLUSIVE null;static final int CANCELLED 1;static final int SIGNAL -1;static final int CONDITION -2;static final int PROPAGATE -3;/*Node只要在Condition单向链表中状态就是上面的-2waitStatus简写wt*/volatile int waitStatus;volatile Node prev;volatile Node next;volatile Thread thread;/*单向链表的下一个节点*/Node nextWaiter;final boolean isShared() {return nextWaiter SHARED;}final Node predecessor() throws NullPointerException {Node p prev;if (p null)throw new NullPointerException();elsereturn p;}Node() { // Used to establish initial head or SHARED marker}Node(Thread thread, Node mode) { // Used by addWaiterthis.nextWaiter mode;this.thread thread;}Node(Thread thread, int waitStatus) { // Used by Conditionthis.waitStatus waitStatus;this.thread thread;}
} Condition是基于Node对象组成的单向链表 在Condition中Node状态必须是-2如果不是-2就可以从中移除掉了Condition的Node是利用nextWaiter属性连接下一个节点Condition中还有指向头尾的两个属性分别是firstWaiter和lastWaiter
Condition的挂起操作流程
当持有lock锁的线程执行以下4个流程
将当前对象封装成Node对象加入单向链表中释放锁资源确认当前线程的Node没有在AQS的同步队列中。如果在说明执行了signal方法那个线程已经进入了同步队列。不需要挂起没有在同步队列直接挂起 Condition的signal唤醒操作流程
确保执行signal的线程持有锁资源将第一个Node从单向链表中断开将Node的状态从-2改成0将Node移到同步队列确保Node在同步队列中可以被唤醒。直接唤醒线程和将prev指向的Node状态设置为-1 Condition在await被唤醒后的逻辑
1、确认被唤醒的方式
单纯地被signal方法唤醒被interrupt中断唤醒被signal唤醒后然后执行了interrupt保留中断标记位
2、确保Node在同步队列后就可以跳出while循环
3、执行acquireQueued方法后等待获取锁资源
4、在获取锁资源的同时如果被中断过需要确认是否保留中断标记位
5、如果是中断唤醒需要将当前Node断开单向链表连接
6、根据中断模型执行抛出异常、方法
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926453.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!