为什么在释放锁的时候是从 tail 进行扫描
回到enq那个方法、在标注为红色部分的代码来看一个新的节点是如何加入到链表中的。
1. 将新的节点的prev指向tail
2. 通过cas将tail设置为新的节点,因为cas是原子操作所以能够保证线程安全性
3. t.next=node;设置原tail的next节点指向新的节点
private Node enq(final Node node) { for (;;) { Node t = tail; if (t == null) { // Must initialize if (compareAndSetHead(new Node())) tail = head; } else { node.prev = t; if (compareAndSetTail(t, node)) { t.next = node; return t; } } }
}
在cas操作之后,t.next=node操作之前。 存在其他线程调用unlock方法从head开始往后遍历,由于t.next=node还没执行意味着链表的关系还没有建立完整。就会导致遍历到t节点的时候被中断。所以从后往前遍历,一定不会存在这个问题。
图解分析
通过锁的释放,原本的结构就发生了一些变化。head节点的waitStatus变成了0, ThreadB被唤醒
为什么在释放锁的时候是从 tail 进行扫描相关推荐
- 为什么await()后会执行lock.unlock,await()时不就释放锁了吗
为什么await()后会执行lock.unlock,await()时不就释放锁了吗 1 是的,释放锁是为了别的线程获得,是为了线程间的通信,是临时释放的,真正满足继续向下执行条件后,被唤醒后获得了锁, ...
- 当我们使用锁同步代码的时候,会在什么时候释放锁呢
1.当前线程的同步方法.代码块执行结束的时候释放. 2.当前线程在同步方法.同步代码块中遇到break . return 终于该代码块或者方法的时候释放. 3.出现未处理的error或者excepti ...
- Synchronize异常释放锁
Synchronize异常释放锁 遇到异常的时候,就会释放锁 对象锁,并不会影响后续队列任务的执行 处理队列 Synchronize处理一个队列,多个任务 任务独立 任务之间不会相互影响,此时,可以遇 ...
- 【代码】使用reentrantlock必须要手动释放锁
使用reentrantlock必须要手动释放锁 import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock ...
- Java中哪些操作会使线程释放锁资源
1.sleep()方法 在指定时间内让当前正在执行的线程暂停执行,但不会释放"锁标志".不推荐使用. sleep()使当前线程进入阻塞状态,在指定时间内不会执行. 2.wait() ...
- 释放锁的逻辑-InterProcessMutex.release
public void release() throws Exception{ Thread currentThread = Thread.currentThread(); LockData lock ...
- 释放锁以及添加线程对于队列的变化
当出现锁竞争以及释放锁的时候,AQS同步队列中的节点会发生变化,首先看一下添加节点的场景. 里会涉及到两个变化 1. 新的线程封装成Node节点追加到同步队列中,设置prev节点以及修改当前节点的前置 ...
- Redis实现分布式锁释放锁
package com.learn;//什么线程安全问题 在同一个jvm中,多个线程共享同一个全局变量做写的操作的时候,可能会收到其他线程的干扰. class ThreadDemo implement ...
- 6.异常释放锁的情况
异常释放锁的情况 对于web程序,异常的释放锁,很可能意味着程序出现了错误,业务逻辑产生了错误的结果导致了严重的错误,比如:一个队列10个任务,很多对象都会去等待第1个 队列正常秩序产生的结果返回再次 ...
最新文章
- java 抛异常给上级_java异常处理机制(示例代码)
- 公示 | 首届中国智能心电大赛初赛结果
- jQuery 事件绑定方法(bind hover toggle live.... )、删除事件方法(unbind, die)及 事件对象
- ACM练习 校赛83C:纸片儿(测试用例通过但WA/TLE)
- iphone 开发内存管理 心得
- ChannelHandler 接口继承关系图
- Linux消息队列的设置及查看
- 上海计算机应用基础自考上机,2012年上海自考《计算机应用基础》上机考核大纲...
- mongodb 下载
- linux服务器有电信和网通,Linux 双网关(电信与联通)
- HTML---网络编程基础知识(2)
- 计算机专业师范类毕业论文,师范生毕业论文范文
- 《阿特拉斯耸耸肩》节选:互害与甩锅的反敏捷组织
- WebDAV之葫芦儿·派盘+Ever play播放器
- pc、h5微信授权登录
- innerText 与 innerHtml的区别 (一)
- explorer被微信企业版劫持一例
- 每日一句功能简单实现
- painter海报插件
- SPSS软件使用教程(2),SPSS统计分析软件 27中文版下载安装