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. 修改oracle内存大小

    在默认安装情况下,oracle的内存分配是按系统内存的大小比例分配的,内存比较大的情况下,oracle所占的内存也大,该情况下,我们一般要修改sga值来减少系统中oracle的内存过大问题. 用dba ...

  2. 搭建Drupal-8.5.3

    环境说明 系统版本    CentOS 6.9 x86_64 软件版本    yum安装nginx 1.10.2 yum安装php 7.2.6(当前的最新版本) yum安装mysql 5.5.60 d ...

  3. 倍福TwinCAT(贝福Beckhoff)基础教程2.2 TwinCAT常见类型使用和转换_字符串

    一般声明字符串都会加一个长度的限制,比如A:STRING(80);至于真实的字符串长度不要超过这个限制即可   在测试中,我演示了两个字符串的方法,CONCAT字符串拼接和REPLACE字符串替换.拼 ...

  4. Win7如何开启Messenger服务

    1 如图所示,在WIN7系统中没有找到Messenger这个服务.因为Messenger在Windows 7/Server 2008 R2里都去掉了   2 而在XP系统中,开启了Messenger服 ...

  5. navigationItem的设置和titleView的设置

    设置导航栏中间的标题 self.navigationItem.title = @"title"; 设置导航栏的主题颜色 self.navigationBar.barTintColo ...

  6. 【Datastage】Datastage在win10上安装报错:This Application requires one of the following versions of the .NET Framework:v1.1.4322 Do you want to install this .NET Framework version now?

    Datastage在win10上安装报错如下: 这个错误的意思是:.netFramWork的版本不符合要求,于是,我在网上下载了一个版本一致的 下载地址为:http://pan.baidu.com/s ...

  7. Loadrunner 关于参数赋值取值的操作

    1.参数的赋值和取值 lr_save_string("hello world","param"); lr_eval_string("{param}&q ...

  8. ios 从url字符串中获取图片名字

    NSString *str = @"http://pic92.nipic.com/file/20160323/22486259_160209631000_2.jpg"; NSLog ...

  9. Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform

    Expression构建DataTable to Entity 映射委托   1 namespace Echofool.Utility.Common { 2 using System; 3 using ...

  10. 工作总结 无法确定条件表达式的类型,因为“<null>”和“System.DateTime”之间没有隐式转换 解决办法 object——Nullable<T> (可空类型)

    可空值类型 备注     一种类型认为是可以为 null,如果它可以分配一个值,也可以分配null,这意味着类型具有无论如何没有值. 默认情况下,所有都引用类型,如String,是否可以为 null, ...