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的更多相关文章

  1. 四、线程同步之Lock和Condition

    Lock同步锁 Lock 在jdk1.5  提供了Lock以便执行同步操作,和synchronized不同的是Lock提供了显示的方法获取锁和释放锁.Lock提供了以下几个方法,请求和释放锁: voi ...

  2. 线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯

    1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值 ...

  3. 【Java线程】Lock、Condition

    http://www.infoq.com/cn/articles/java-memory-model-5  深入理解Java内存模型(五)——锁 http://www.ibm.com/develope ...

  4. 【Java线程】锁机制:synchronized、Lock、Condition

    http://www.infoq.com/cn/articles/java-memory-model-5  深入理解Java内存模型(五)——锁 http://www.ibm.com/develope ...

  5. 并发之lock的condition接口

    13.死磕Java并发-----J.U.C之Condition 12.Condition使用总结 11.Java并发编程系列之十七:Condition接口 === 13.死磕Java并发-----J. ...

  6. Lock和Condition在JDK中LinkedBlockingQueue的应用

    Lock和Condition在JDK中LinkedBlockingQueue的应用,核心源码注释解析如下: import java.util.concurrent.LinkedBlockingQueu ...

  7. java并发编程系列三、Lock和Condition

    有了synchronized为什么还要Lock? 因为Lock和synchronized比较有如下优点 1. 尝试非阻塞地获取锁 2. 获取锁的过程可以被中断 3. 超时获取锁 Lock的标准用法 p ...

  8. 多线程系列三:Lock和Condition

    有了synchronized为什么还要Lock? 因为Lock和synchronized比较有如下优点 1. 尝试非阻塞地获取锁 2. 获取锁的过程可以被中断 3. 超时获取锁 Lock的标准用法 p ...

  9. 【Java线程】锁机制:synchronized、Lock、Condition(转)

    原文地址 1.synchronized 把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility). 1.1 原子性 ...

随机推荐

  1. WO+开放平台:API调用开发手记(话费计费接口2.0)

    WO+能力共享平台(http://open.wo.com.cn)是中国联通推出的开放平台.拥有的丰富电信能力资源以及深度整合挖掘的第三方能力资源等.WO+平台提供的API均为简洁优雅的RESTful风 ...

  2. 第三章,设置button边框(Android)

    这样的方法是通过层叠几个图片实现边框效果. 在res目录下的drawable目录下(没有就新建)建一个xml文件选layer-list. <?xml version="1.0" ...

  3. Angular 学习笔记——ng-disable

    <!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...

  4. Linux非阻塞IO(八)使用epoll重新实现非阻塞的回射服务器

    本文无太多内容,主要是几个前面提到过的注意点: 一是epoll的fd需要重新装填.我们将tcp_connection_t的指针保存在数组中,所以我们以这个数组为依据,重新装填fd的监听事件. //重新 ...

  5. object-c 框架之经常使用结构体

    Foundation 框架定义经常使用结构体.结构体採用object-c 定义:经常使用NSSRange,NSPoint.NSSize,NSRect等 一.NSRange 创建范围结构体. 方法:NS ...

  6. Php函数之end

    Php函数之end end()函数 (PHP 4, PHP 5, PHP 7) end - 将数组的内部指针指向最后一个单元 说明 mixed end ( array &$array ) en ...

  7. linux驱动current,引用当前进程,及task_struct(转)

    尽管内核模块不象应用程序一样顺序执行, 内核做的大部分动作是代表一个特定进程的. 内核代码可以引用当前进程, 通过存取全局项 current, 它在 <asm/current.h> 中定义 ...

  8. 关于 Nginx 并发连接数

    关于 Nginx 并发连接数 最近在学习使用 nginx , 做一些简单的压力测试时,发现并发连接数最大只能上到 100 多 测试刚开始时的状态 , netstat -n | awk '/^tcp/ ...

  9. sass的脑图

  10. 图解WinHex使用入门

    一 Winhex和相关概念简单介绍 1 Winhex 是在Windows下执行的十六进制编辑软件,此软件功能很强大,有完好的分区管理功能和文件管理功能.能自己主动分析分区链和文件簇链.能对硬盘进行不同 ...