回到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 进行扫描相关推荐

  1. 为什么await()后会执行lock.unlock,await()时不就释放锁了吗

    为什么await()后会执行lock.unlock,await()时不就释放锁了吗 1 是的,释放锁是为了别的线程获得,是为了线程间的通信,是临时释放的,真正满足继续向下执行条件后,被唤醒后获得了锁, ...

  2. 当我们使用锁同步代码的时候,会在什么时候释放锁呢

    1.当前线程的同步方法.代码块执行结束的时候释放. 2.当前线程在同步方法.同步代码块中遇到break . return 终于该代码块或者方法的时候释放. 3.出现未处理的error或者excepti ...

  3. Synchronize异常释放锁

    Synchronize异常释放锁 遇到异常的时候,就会释放锁 对象锁,并不会影响后续队列任务的执行 处理队列 Synchronize处理一个队列,多个任务 任务独立 任务之间不会相互影响,此时,可以遇 ...

  4. 【代码】使用reentrantlock必须要手动释放锁

    使用reentrantlock必须要手动释放锁 import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock ...

  5. Java中哪些操作会使线程释放锁资源

    1.sleep()方法 在指定时间内让当前正在执行的线程暂停执行,但不会释放"锁标志".不推荐使用. sleep()使当前线程进入阻塞状态,在指定时间内不会执行. 2.wait() ...

  6. 释放锁的逻辑-InterProcessMutex.release

    public void release() throws Exception{ Thread currentThread = Thread.currentThread(); LockData lock ...

  7. 释放锁以及添加线程对于队列的变化

    当出现锁竞争以及释放锁的时候,AQS同步队列中的节点会发生变化,首先看一下添加节点的场景. 里会涉及到两个变化 1. 新的线程封装成Node节点追加到同步队列中,设置prev节点以及修改当前节点的前置 ...

  8. Redis实现分布式锁释放锁

    package com.learn;//什么线程安全问题 在同一个jvm中,多个线程共享同一个全局变量做写的操作的时候,可能会收到其他线程的干扰. class ThreadDemo implement ...

  9. 6.异常释放锁的情况

    异常释放锁的情况 对于web程序,异常的释放锁,很可能意味着程序出现了错误,业务逻辑产生了错误的结果导致了严重的错误,比如:一个队列10个任务,很多对象都会去等待第1个 队列正常秩序产生的结果返回再次 ...

最新文章

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

热门文章

  1. mysql索引背后的数据结构及算法
  2. u3d:动态的用代码调节材质球的属性
  3. webapi+ajax跨域问题及cookie设置
  4. 谈谈我的移动端rem适配方案
  5. Jquery基础 ajax error函数
  6. Solr入门和实践以及我对Solr的8点理解
  7. IOS开发笔记之十七——一个关于工程目录读写权限的问题
  8. ip camera芯片级解决方案
  9. nand ubi -1 nand基础
  10. NYOJ-42 一笔画问题