回到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. java 抛异常给上级_java异常处理机制(示例代码)
  2. 公示 | 首届中国智能心电大赛初赛结果
  3. jQuery 事件绑定方法(bind hover toggle live.... )、删除事件方法(unbind, die)及 事件对象
  4. ACM练习 校赛83C:纸片儿(测试用例通过但WA/TLE)
  5. iphone 开发内存管理 心得
  6. ChannelHandler 接口继承关系图
  7. Linux消息队列的设置及查看
  8. 上海计算机应用基础自考上机,2012年上海自考《计算机应用基础》上机考核大纲...
  9. mongodb 下载
  10. linux服务器有电信和网通,Linux 双网关(电信与联通)
  11. HTML---网络编程基础知识(2)
  12. 计算机专业师范类毕业论文,师范生毕业论文范文
  13. 《阿特拉斯耸耸肩》节选:互害与甩锅的反敏捷组织
  14. WebDAV之葫芦儿·派盘+Ever play播放器
  15. pc、h5微信授权登录
  16. innerText 与 innerHtml的区别 (一)
  17. explorer被微信企业版劫持一例
  18. 每日一句功能简单实现
  19. painter海报插件
  20. SPSS软件使用教程(2),SPSS统计分析软件 27中文版下载安装

热门文章

  1. POJ3398 Perfect Service
  2. 【BZOJ2118】墨墨的等式【循环节做法】
  3. 零基础入门Python3-set集合详解
  4. 一加3 CM13 12306 不能用
  5. 《Android编程权威指南》PhotoGallery应用梳理
  6. C#微信公众号开发 -- (七)自定义菜单事件之VIEW及网页(OAuth2.0)授权
  7. FLASH CS3中的FLA形式组件制作教程
  8. 数组和矩阵问题:奇数下标都是奇数或者偶数下标都是偶数
  9. time模块及datetime模块常用方法讲解
  10. (59) 解决在列表视图复制导致打开详细内容