为什么在释放锁的时候是从 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个 队列正常秩序产生的结果返回再次 ...
最新文章
- jquery自定义对话框alert、confirm和prompt
- 5G NGC — 关键技术 — MEC 边缘云
- 日志管理系统的重要性---怼死你的客户
- Oracle 学习笔记:Backup Recovery 常用命令
- 婚姻里的潜规则:你的男人也嫌你穷【转】
- php自动配置ip,使用PHP自动PING IP
- 『ACM-算法-ST算法』信息竞赛进阶指南--区间最值问题的ST算法
- 漫画:35岁的IT会不会失业?
- 苹果AirPods有望在年末推出新款产品 或将支持防水功能
- python集成开发环境运行快捷键_Python初学者选择集成开发环境必看 python开发
- 《玩转Django2.0》读书笔记-编写URL规则
- 修改strut默认的action后缀
- 【BZOJ5336】[TJOI2018]party(动态规划)
- python爬虫自学笔记本(2015.12.14)
- 路径详解(绝对路径,相对路径,根相对路径)
- 明源售楼系统技术解析 签约管理(一)
- nginx证书绑定及二级域名反向代理
- ArcGIS,CC(Smart3D),ENVI....工作中常用软件的汉化包都在这,随你下载
- CrossOrigin注解的方式实现接口的跨域访问
- 试玩系列 | 真香!大疆TT无人机编程初体验,教你对它为所欲为!