Lock和Condition
1 什么是可重入锁
可重入锁是说一个线程在已经获取了该锁的情况下,还可以再次获取该锁。
主要的应用场景:
可重入锁指的是在一个线程中可以多次获取同一把锁,比如:
一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,
则该线程可以直接执行调用的方法,而无需重新获得锁;
ReentrantLock和Synchronized都是可重入锁。
2 ReentrantLock公平锁和非公平锁
公平锁按照对锁FIFO的获取顺序来获取锁,在获取锁前会进行一个判断,判断锁的等待队列中是否已经有人,如果有人的话直接获取不成功,也就是说让给别人。
非公平锁就是抢。
非公平锁不需要线程的切换,具有更大的系统吞吐,因此jdk默认是非公平锁。
3 有了锁为什么要引入Condition
为了实现生产者消费者模式。
4 AbstractQueuedSynchronizer的condition queue和sync queue
为什么要将一个节点从condition queue移动到sync queue?
5 AbstractQueuedSynchronizer最终是调用LockSupport.park()阻塞和LockSupport.unpark释放线程
6 ReentrantLock最终也是调用LockSupport.park()阻塞的
当线程没有获取到ReentrantLock的时候,就会被LockSupport.park()阻塞。
当获取了该锁的线程释放该锁的时候,会调用LockSupport.unpark()来唤醒sync queue中的一个线程。
7 Lock和Condition统一于LockSupport.park()和LockSupport.unpark(),准备了两个队列,condition queue和sync queue
8 Condition为什么要和Lock绑定
在等待condition之前,必须要先获取其所关联的Lock,这是为什么?
就队列而言,是Lock在保护着的,如果不保护好的话,别的线程会抢走,比如放入一个元素,这个时候就乱了。因此,必须要先获取其所关联的lock。
如果发现队列中没有元素,这个时候该线程就需要等待了。为了不阻塞别的线程前来访问队列,就需要释放其所关联的Lock。
9 ArrayBlockingQueue的take函数
获取的该ArrayBlockingQueue的全局的lock还没有释放的时候,如果是该queue是空的,这个时候会阻塞该线程,但是,它的全局lock并没有释放。这样不会带来问题吗?
不会带来问题,在await的时候,会自动将全局的lock释放。
Condition在调用await的时候,会调用fullyRelease,再调用release将sync queue中的head的下一个线程unpark,就是把全局的lock释放。
这个里面还有一些东西需要进一步搞清楚。
10 参考资料
10.1 彻底理解ReentrantLock
https://blog.csdn.net/u011521203/article/details/80186741
Lock和Condition的更多相关文章
- 四、线程同步之Lock和Condition
Lock同步锁 Lock 在jdk1.5 提供了Lock以便执行同步操作,和synchronized不同的是Lock提供了显示的方法获取锁和释放锁.Lock提供了以下几个方法,请求和释放锁: voi ...
- 线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯
1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值 ...
- 【Java线程】Lock、Condition
http://www.infoq.com/cn/articles/java-memory-model-5 深入理解Java内存模型(五)——锁 http://www.ibm.com/develope ...
- 【Java线程】锁机制:synchronized、Lock、Condition
http://www.infoq.com/cn/articles/java-memory-model-5 深入理解Java内存模型(五)——锁 http://www.ibm.com/develope ...
- 并发之lock的condition接口
13.死磕Java并发-----J.U.C之Condition 12.Condition使用总结 11.Java并发编程系列之十七:Condition接口 === 13.死磕Java并发-----J. ...
- Lock和Condition在JDK中LinkedBlockingQueue的应用
Lock和Condition在JDK中LinkedBlockingQueue的应用,核心源码注释解析如下: import java.util.concurrent.LinkedBlockingQueu ...
- java并发编程系列三、Lock和Condition
有了synchronized为什么还要Lock? 因为Lock和synchronized比较有如下优点 1. 尝试非阻塞地获取锁 2. 获取锁的过程可以被中断 3. 超时获取锁 Lock的标准用法 p ...
- 多线程系列三:Lock和Condition
有了synchronized为什么还要Lock? 因为Lock和synchronized比较有如下优点 1. 尝试非阻塞地获取锁 2. 获取锁的过程可以被中断 3. 超时获取锁 Lock的标准用法 p ...
- 【Java线程】锁机制:synchronized、Lock、Condition(转)
原文地址 1.synchronized 把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility). 1.1 原子性 ...
随机推荐
- 几个有关Hadoop自带的性能测试工具的应用
http://www.talkwithtrend.com/Question/177983-1247453 一些测试的描述如下内容最为详细,供你参考: 测试对于验证系统的正确性.分析系统的性能来说非常重 ...
- 2017.4.7 e.toString() 与 e.getMessage()的区别
我使用的时候,抛出了空指针异常,本来是想将异常信息显示在errorInfo里,却发现没有拿到错误信息. 原因:我用的是getMessage(). 用e.getMessage() 时,返回的是null. ...
- 在项目中引用android.support.v7
在Android开发中,新建的项目可能因为缺少对sopport工程的引用而报错,可以这样解决. 1.项目右键 --> import --> Android --> Existing ...
- 【Unity】脚本选择打勾的勾选框隐藏
这个问题事实上已经遇到过好几次了.但又没有特别的须要手动勾选,所以也一直都没在意. 今天研究了一下,原来是由于我删除了Start方法...... 所以.仅仅要脚本中没有Start方法,勾选框就会隐藏掉 ...
- vscode - 安装离线插件
打开网站(示例): https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow 下载扩展 vscode 安装离 ...
- JavaScript类数组转换为数组 面试题
1.JavaScript类数组转换为数组 (1)方法一:借用slice (2)方法二:Array.from 2.代码 <!DOCTYPE html> <html lang=" ...
- git merge 和 git rebase 小结(转)
git merge是用来合并两个分支的. git merge b # 将b分支合并到当前分支 同样 git rebase b,也是把 b分支合并到当前分支 ---------------------- ...
- 实战Jquery(一)--username校验
歇息了好几天,最终又開始学习了.jQuery? JQuery is designed to change the way that you write JavaScript. The focus of ...
- Android 热修复使用Gradle Plugin1.5改造Nuwa插件
随着谷歌的Gradle插件版本号的不断升级,Gradle插件如今最新的已经到了2.1.0-beta1,相应的依赖为com.android.tools.build:gradle:2.0.0-beta6, ...
- handlebars.js基础学习笔记
最近在帮学校做个课程网站,就有人推荐用jquery+ajax+handlebars做网站前端,刚接触发现挺高大上的,于是就把一些基础学习笔记记录下来啦. 1.引用文件: jquery.js文件下载:h ...