reentrantlock

ReentrantLock Condition 线程间通信

早过忘川 提交于 2020-01-10 10:00:05
方法介绍: boolean await() 阻塞线程 直至被唤醒 boolean await(long time, TimeUnit unit) 阻塞线程 超时自动唤醒 void signal() 唤醒一个await线程 void signalAll() 唤醒所有await线程 场景举例: 班级组织郊游, 每个到了的同学就在原地等待上大巴,先到的排在最前面, 后到的紧接着排在最后一个人后面, 直到班长来了, 班长有两种方式让让同学上车, 方式一: 班长从前往后一个一个点 点到几个上几个(按排队顺序) ------- await() + signal() 的使用 方式二: 班长直接让所有人按排队顺序上车 ----- await() + signalAll() 的使用 方式一代码如下: public static void main(String[] args) throws InterruptedException { ReentrantLock lock = new ReentrantLock(); //new condition Condition condition = lock.newCondition(); //t1线程 Thread t1 = new Thread(()->{ try { lock.lock(); System.out.println("t1到位准备

ConcurrentHashMap1.7和1.8对比

孤人 提交于 2020-01-08 22:59:35
https://medium.com/@itsromiljain/curious-case-of-concurrenthashmap-90249632d335   这个讲的就是1.7的概念性 https://crossoverjie.top/2018/07/23/java-senior/ConcurrentHashMap/   分析对比写的不错 具体代码去看jdk 1.7 /** * Segment 数组,存放数据时首先需要定位到具体的 Segment 中。 */ final Segment<K,V>[] segments; transient Set<K> keySet; transient Set<Map.Entry<K,V>> entrySet; Segment是一个内部类 static final class Segment<K,V> extends ReentrantLock implements Serializable { private static final long serialVersionUID = 2249069246763182397L; // 和 HashMap 中的 HashEntry 作用一样,真正存放数据的桶 transient volatile HashEntry<K,V>[] table; transient int count;

ReentrantLock 详解

为君一笑 提交于 2020-01-08 10:02:21
一、初始ReentrantLock ReentrantLock 位于 java.util.concurrent.locks 包下,它实现了 Lock 接口 和 Serializable 接口 。ReentrantLock 是一把 可重入锁 和 互斥锁 ,它具有与 synchronized 关键字相同的含有隐式监视器锁(monitor)的基本行为和语义,但是它比 synchronized 具有更多的方法和功能。 二、 ReentrantLock的基本方法 1. 构造函数 ReentrantLock 类中带有两个构造函数,一个是默认的构造函数,不带任何参数;一个是带有 fair 参数的构造函数。 public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); } 第二个构造函数也是判断 ReentrantLock 是否是公平锁的条件,如果 fair 为 true,则会创建一个 公平锁 的实现,也就是 new FairSync() ,如果 fair 为 false,则会创建一个 非公平锁 的实现,也就是 new NonfairSync() ,默认的情况下创建的是非公平锁。

Java并发(五)模版方法模式

只愿长相守 提交于 2020-01-07 19:55:04
1. 模版方法结构 模板方法的本质其实就是类的继承,模板方法模式需要开发抽象类和具体子类的设计之间的协作,我们实际工作中应该有很多这样的场景,比如我们通常会在业务逻辑层定义好Service类的抽象方法,而实际的业务逻辑实现会交给ServiceImpl类。模板方法模式的类结构图大致如下: 抽象模板 (AbstractTemplate) 角色有如下责任: 定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤。定义并实现了一个模板方法,这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。AbstractQueuedSynchronizer就是这样一个抽象模板。 具体模板 (ConcreteTemplate) 角色又有如下责任: 实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤。每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。ReentrantLock算是这样一个具体模板,不过ReentrantLock把自己的实现又委托给了内部实现类Sync。 模板模式的关键是: 子类可以置换掉父类的可变部分

ReentrantLock源码

雨燕双飞 提交于 2020-01-05 18:40:23
ReentrantLock与Synchronized区别在于后者是JVM实现,前者是JDK实现,属于Java对象,使用的时候必须有明确的加锁(Lock)和解锁(Release)方法,否则可能会造成死锁。 先来查看ReentrantLock的继承关系(下图),实现了Lock和Serializable接口,表明ReentrantLock对象是可序列化的。 同时在ReentrantLock内部还定义了三个重要的内部类,Sync继承自抽象类AbstractQueuedSynchronizer(队列同步器)。其后又分别定义了它的两个子类公平锁FairSync和非公平锁NonfairSync。 /** * Base of synchronization control for this lock. Subclassed * into fair and nonfair versions below. Uses AQS state to * represent the number of holds on the lock. */ abstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = -5179523762034025860L; /**

jstack命令解析

雨燕双飞 提交于 2020-01-04 02:34:26
jstack用法 /opt/java8/bin/jstack Usage: jstack [-l] <pid> (to connect to running process) 连接活动线程 jstack -F [-m] [-l] <pid> (to connect to a hung process) 连接阻塞线程 jstack [-m] [-l] <executable> <core> (to connect to a core file) 连接dump的文件 jstack [-m] [-l] [server_id@]<remote server IP or hostname> (to connect to a remote debug server) 连接远程服务器 Options: -F to force a thread dump. Use when jstack <pid> does not respond (process is hung) -m to print both java and native frames (mixed mode) -l long listing. Prints additional information about locks -h or -help to print this help message jstack查看输出 /opt

ReentrantLock

南笙酒味 提交于 2020-01-01 22:47:05
ReentrantLock阅读笔记 文章目录 ReentrantLock阅读笔记 问题 一、简介 二、继承关系图 三、存储结构 四、源码分析 内部类 属性 构造 主要方法 **1、加锁源码**(公平模式), 第二次 后面的获取锁都是先判断了是否是队列中的第一个节点,如果是才会去尝试获取锁, **2、加锁源码(非公平模式)** 3、lockInterruptibly() 4、tryLock() 5、tryLock(long timeout,TimeUnit unit); 6、unlock() 补充:条件锁源码 五、总结 问题 1、为什么默认是非公平模式 因为效率比公平模式高 2、为什么非公平效率高 因为非公平锁会在开始就尝试2次获取锁,少了排队导致的阻塞/等待过程,减少了线程频繁的切换带来的性能开销 3、非公平模式的弊端 非公平模式下可能导致一开始排队的线程一直获取不到锁,导致线程饿死。 一、简介 此内容仅仅含有公平模式和非公平模式,不含条件锁源码 二、继承关系图 是Lock的实现类,Lock是一个接口, public interface Lock { // 获得锁 void lock ( ) ; // 获得锁,可中断 void lockInterruptibly ( ) throws InterruptedException ; // 如果锁处于等待,则获取锁 boolean

Java锁:可重入锁(递归锁)

丶灬走出姿态 提交于 2020-01-01 10:38:23
可重入锁 也叫递归锁:递归传递同一把锁 理解: 同一个线程在进入外层同步方法获得锁之后,同样可以进入该外层同步方法中所拥有的内层同步方法,它们此时所拥有的是同一把锁 这种设计可以避免死锁(如果不是可重入锁,在进入外层同步方法之后,无法进入该外层同步方法所拥有的内层同步方法,这种情况下就会出现死锁) synchronized/ReentrantLock都是可重入锁 代码示例和解释: import java . util . concurrent . locks . Lock ; import java . util . concurrent . locks . ReentrantLock ; /** * 可重入锁:synchronized/ReentrantLock都是可重入锁 * 可重入锁(也叫递归锁:递归传递同一把锁) * 同一个线程在进入外层同步方法获得锁之后,同样可以进入该外层同步方法中所拥有的内层同步方法,它们此时所拥有的是同一把锁 * 这种设计可以避免死锁(如果不是可重入锁,在进入外层同步方法之后,无法进入该外层同步方法所拥有的内层同步方法,这种情况下就会出现死锁) */ public class LockTest { public static void main ( String [ ] args ) { //创建一个资源类对象实例 LockResource

【面试专栏】阻塞队列

不想你离开。 提交于 2019-12-31 21:35:57
文章同步更新在个人公众号“梓莘”,欢迎大家关注,相互交流。 阻塞队列 ArrayBlockingQueue 是一个基于数组的有界阻塞队列,此队列基按FIFO原则对元素进行排序 LinkedBlockQueue:一个基于链表结构的阻塞队列,次队列按FIFO排序元素,吞吐量通常要高于ArrayBlockingQueue SynchromousQueue:一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockQueue 阻塞队列:首先它是一个队列,而一个阻塞队列在数据结构中所其的作用大致如图 当阻塞队列是空时,从队列中获取元素的操作将会被阻塞 当阻塞队列是满时,往队列中添加元素的操作将会被阻塞 试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程王空的队列中插入新的元素。 试图往满的阻塞队列中添加新元素的线程通用也会被阻塞,直到其他的线程从队列中移除一个或者多个元素或者完全清空队列后使队列重新变得空闲起来并后续新增。 为什么用 好处是什么? 在多线程领域中:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤醒。 为什么需要BlockingQueue? 好处是我们不需要关系什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQueue都实现了。

Condition give the effect of having multiple wait-sets per object?

泪湿孤枕 提交于 2019-12-30 07:39:33
问题 I am reading about Condition in java.util.concurrent.locks.Condition . Condition factors out the Object monitor methods (wait, notify and notifyAll) >into distinct objects to give the effect of having multiple wait-sets per object, by combining them with the use of arbitrary Lock implementations. Can somebody explain me this? How this is a benefit over normal synchronization blocks or method? 回答1: One Lock can be associated with many Conditions. Lock is an "object", each condition is a