一、node概念

1、当线程获取锁失败时,会被打包成一个node放到同步队列中

2、node属性

当线程获取锁失败时,会被打包成一个node放到同步队列中,所以node属性中有一个thread属性;

3、condition中有一个等待队列

二、同步状态获取和释放源码实现

for(;;)自旋,编译后比while(true)执行指令少,就一行;

1、独占锁同步状态获取和实现

先尝试拿锁:

获取不到锁加入等待队列:

尾节点为空或者被其他线程改了,进入自旋:

自旋中,如果尾节点为空,则把首节点赋值给尾节点,不为空或者后面再判断时不为空,自己加到尾节点后面;

加入到同步队列中后:

节点开始在同步队列中自旋,判断自己前面是不是头节点,如果是就开始尝试获取锁:

如果前面不是头节点或者没有获取到锁,则自己进入阻塞状态:

头节点获取锁执行完之后,释放锁:

释放锁之后唤醒下一个成为头节点的节点中的线程:

三、condition等待队列

等待队列和同步队列存放的是结构一样的node节点;
正常情况下的线程会在同步队列中自旋,尝试获取锁,如果调用了await方法,则从同步队列中加入到等待队列中,阻塞,不再是自旋;

调用signal方法会从等待队列唤醒,转移到同步队列中,自旋取获取锁;

四、可重入锁

调用多次,锁的计数器一直加1,执行完一次就 -1,到0时候就释放锁;

不然自己占着锁,1 ,就无法原子操作 0->1,自己死锁;

五、共享锁

如读锁,可以被多个线程共同访问,status设置为10,拿一个减1,到0为止,释放一个再+1;

有点类似 Semaphore 工具类,做流控,防止一个资源被访问太多;

最新文章

  1. 初始webservice
  2. [Java] Spring + SpringMVC + Maven + JUnit 搭建
  3. 基本排序算法——选择排序java实现
  4. 20145222GDB调试汇编堆栈过程分析
  5. Erlang及Rabbitmq安装
  6. 短信SMS的接收
  7. Hadoop 文件的数量怎么比block的数量多?
  8. Java并发编程:并发容器之ConcurrentHashMap
  9. javascript 编写的贪吃蛇
  10. ADT "Running Android Lint" has encountered a problem
  11. MYSQL一次性能优化实战经历[转]
  12. JavaScript数组知识点
  13. Java之多态
  14. 城市安全风险管理项目Postmortem结果
  15. ElasticSearch权威指南学习(分布式集群)
  16. 微软BI SSIS 2012 ETL 控件与案例精讲面试 200 问(SSIS 面试题,ETL 面试题)
  17. [翻译] 学习iOS开发的建议:如何从菜鸟到专家
  18. What do you think the coming adidas NMD Singapore
  19. 前端ps切图,图文教程,详细。
  20. Java jxl导入excel文件,导入的数字、身份证号码、手机号变成了科学计数法,解决方案

热门文章

  1. 字节跳动Android实习面试难吗,应该如何应对?
  2. 90%的开发者都不知道的UI本质原理和优化方式
  3. Vue实现点击按钮进行文件下载(后端Java)
  4. 深入理解HTTP请求流程
  5. hdmi 随笔
  6. 数据结构与算法-排序(八)计数排序(Counting Sort)
  7. NOIP 模拟 $15\; \text{影子}$
  8. centos7上安装redis6-0-5
  9. Java:学习什么是多线程
  10. DQL,DML,DDL,DCL分别是什么?