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 原子性 ...
随机推荐
- wp8开发时模拟器无法联网解决方法
关于模拟器无法联网的正常解决方案在网上有很多 这里讲的是我在做测试的时候模拟器无法上网的特殊情况 由于使用的是无线网络 可能有一些差别 过程如图: 启动模拟器 如果之前没有设置过模拟器的交换器则会出现 ...
- .NET MVC执行过程 及 生命周期步骤
1.网址路由比对 2.执行Controller与Action 3.执行View并返回结果 Request 请求到来 IIS 根据请求特征将处理权移交给 ASP.NET UrlRoutingModule ...
- [Algorithms] Solve Complex Problems in JavaScript with Dynamic Programming
Every dynamic programming algorithm starts with a grid. It entails solving subproblems and builds up ...
- 使用JMeter录制手机App脚本
Apache JMeter是100%的Java桌面应用程序,用于对软件做压力测试.它最初被设计用于Web应用测试,但后来扩展到其他测试领域.现如今这款软件越来越受到测试人员的青睐,相比于LoadRun ...
- C++ 设置控制台输出颜色
#include <stdint.h> #include <iostream> #include <string> #include <Windows.h&g ...
- 如何用PS快速的批量制作连续号码数字编号图解
如何用PS快速的批量制作连续号码数字编号图解 大家好,今天太原博飞设计培训小编就告诉大家如用PS快速的制作连续数字编号,在工作中尤其是大型活动的有时候制作连续的号码牌,少还好,如果上百上千个,那就辛苦 ...
- 【VBA】复制单元格批注
只复制单元格的批注该怎么操作呢?代码如下: Public Sub 复制单元格批注() Dim range1 As range Dim range2 As range '清除G列 Columns(&qu ...
- mongo 游标
游标是什么? 通俗的说游标不是查询结果,而是查询的返回资源,或者说是查询返回的接口. 通过这个接口,我们可以逐条读取数据. 就像php中我们使用fopen打开文件,得到的是一个资源,通过这个资源,我们 ...
- C# : 资源文件(多用于处理国际化)
1.建立Resource文件夹,添加资源文件 处理国际化的问题,我们可以添加多个资源文件,如下就是添加一个中文的,一个英文的. 2.向其中添加键值对. 3.取值 CultureInfo uiCultu ...
- git个人使用总结(界面版)
最近开始使用GIT来管理测试文档,从0到1开始使用git 1.首先,使用网页登录GIT后,创建项目 2.创建项目后,需要配置一下访问者权限 3.然后在网页版GIT复制地址,git clone到 本地 ...