reentrantlock

Difference in internal storing between 'fair' and 'unfair' lock

ぐ巨炮叔叔 提交于 2021-01-18 06:25:09
问题 The way Lock interface with class Reentrant(true) lock works is that it uses BlockingQueue to store Threads that want to acquire the lock . In that way thread that 'came first, go out first'-FIFO. All clear about that. But where do 'unfair locks' go, or ReentrantLock(false). What is their internal implementation? How does OS decide which thread now to pick? And most importantly are now these threads also stored in a queue or where? (they must be somewhere) 回答1: The class ReentrantLock does

Difference in internal storing between 'fair' and 'unfair' lock

戏子无情 提交于 2021-01-18 06:25:07
问题 The way Lock interface with class Reentrant(true) lock works is that it uses BlockingQueue to store Threads that want to acquire the lock . In that way thread that 'came first, go out first'-FIFO. All clear about that. But where do 'unfair locks' go, or ReentrantLock(false). What is their internal implementation? How does OS decide which thread now to pick? And most importantly are now these threads also stored in a queue or where? (they must be somewhere) 回答1: The class ReentrantLock does

Does synchronized block have max reentrant limit?

孤街醉人 提交于 2020-05-10 17:55:51
问题 As we know, ReentrantLock has a max reentrant limit: Integer.MAX_VALUE ; Does synchronized block have reentrant limit too? Update : I found it is hard to write test code for synchronized reentrant: public class SyncReentry { public static void main(String[] args) { synchronized (SyncReentry.class) { synchronized (SyncReentry.class) { // ...write synchronized block for ever } } } } Can anyone help write some code for synchronized reentrant limit test? 回答1: Since the specification does not

ReentrantLock和synchronized的区别

久未见 提交于 2020-04-08 13:00:55
1)首先:Reentrantlock用于替代synchronized 但是Reentrantlock比较灵活 需要注意的是,必须要必须要必须要手动释放锁(重要的事情说三遍) 使用syn锁定的话如果遇到异常,jvm会自动释放锁,但是lock必须手动释放锁,因此经常在finally中进行锁的释放 2)使用reentrantlock可以进行“尝试锁定”tryLock,这样无法锁定,或者在指定时间内无法锁定,线程可以决定是否继续等待 void m2() { boolean locked = false; try { locked = lock.tryLock(5, TimeUnit.SECONDS); System.out.println("m2 ..." + locked); } catch (InterruptedException e) { e.printStackTrace(); } finally { if(locked) lock.unlock(); } } 3)使用ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应, 在一个线程等待锁的过程中,可以被打断 Lock lock = new ReentrantLock(); Thread t1 = new Thread(()->{ try { lock.lock()

007. J.U.C 之锁的使用

£可爱£侵袭症+ 提交于 2020-04-06 01:53:40
1. Lock API 1. Locks 包类层次结构 2. Lock 接口 方法签名 描述 void lock(); 获取锁(不死不休) boolean tryLock(); 获取锁(浅尝辄止) boolean tryLock(long time, TimeUnit unit) throws InterruptedException; 获取锁(过时不候) void lockInterruptibly() throws InterruptedException; 获取锁(任人摆布) void unlock(); 释放锁 Condition newCondition(); 结论: lock() 最常用,并且线程不会被中断; lockInterruptibly() 方法一般更昂贵,有的 impl 可能没有实现 lockInterruptibly(),只有真的需要效应中断时,才使用,使用之前看看 impl 对该方法的描述。 public class Demo1_GetLock { // 公平锁 // static Lock lock = new ReentrantLock(true); // 非公平锁 static Lock lock = new ReentrantLock(); public static void main(String[] args) throws

ReentrantLock 公平锁VS非公平锁

杀马特。学长 韩版系。学妹 提交于 2020-04-05 20:48:13
ReentrantLock 先来看看底层源码,只实现了Lock接口和序列化接口,其中还有3个内部类,3个内部类的实现 public class ReentrantLock implements Lock, java.io.Serializable 看看它的构造方法 public ReentrantLock() { // 默认实现非公平锁 sync = new NonfairSync(); } public ReentrantLock(boolean fair) { // 根据你传的值判断实现公平锁还是非公平锁 sync = fair ? new FairSync() : new NonfairSync(); } 字段 // 持有一个Sync实例,既构造方法中生成公平锁或非公平锁实例 private final Sync sync; 1.lock() 在NonfairSync中 final void lock() { // 判断当前state值是否为0,,如果为0则修改为1,并且将线程置为当前线程 if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else // 尝试获取锁 acquire(1); } trylock final boolean

Java并发编程锁系列之ReentrantLock对象总结

余生颓废 提交于 2020-04-05 15:01:39
Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种。ReentranckLock就是其中的多个分类。 本文主要内容:重入锁理解;重入锁代码演示; ReentranckLock的总结 本篇是《凯哥(凯哥Java:kagejava)并发编程学习》系列之《Lock系列》教程的第四篇:《Java并发包下锁学习第六篇:ReentranckLock的总结》。 我们先来看看内部结构: ReentranckLock内部有三个内部类,分别是: Sync:继承了AbstractQueuedSynchronizer(AQS)同步器的内部类,来实现同步机制的; FairSync:公平锁对象; NonfairSync:非公平锁对象。 关于公平锁与非公平锁详细介绍文章见:《Java并发编程锁之独占公平锁与非公平锁比较》和《Java并非锁之独占非公平锁理解》两篇文章。 再来看看对象名称:Reentranck的中文意思:再入、重入的意思。即该对象还是重入锁。 公平锁和非公平锁在获取锁的区别在于: 公平锁获取锁的时候,进入排队。源码如下图: 非公平锁线尝试插队,如果插队不成功再进行排队。源码如下图: 那么什么是重入锁呢? 重入锁(递归锁)可以理解为:同一个线程函数获得锁之后,内层递归函数依然能够获取到该锁对象的代码,也即

Java多线程系列--“JUC锁”05之 非公平锁

三世轮回 提交于 2020-04-02 14:06:14
概要 前面两章分析了"公平锁的获取和释放机制",这一章开始对“非公平锁”的获取锁/释放锁的过程进行分析。内容包括: 参考代码 获取非公平锁(基于JDK1.7.0_40) 释放非公平锁(基于JDK1.7.0_40) 关于锁的数据结构请参考" Java多线程系列--“JUC锁”03之 公平锁(一) ",锁的使用示例请参考“ Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock ”。 转载请注明出处: http://www.cnblogs.com/skywang12345/p/3496651.html 参考代码 下面给出Java1.7.0_40版本中,ReentrantLock和AQS的源码,仅供参考! ReentranLock.java 1 /* 2 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 * 15 * 16 * 17 * 18 * 19 * 20 * 21 * 22 * 23 */ 24 25 /* 26 * 27 * 28 * 29 * 30 * 31 * Written by Doug Lea with assistance from members of JCP

(锁) 系列篇

半世苍凉 提交于 2020-03-27 16:44:12
(锁) 系列篇 3.2、通过独占锁ReentrantLock理解AQS 目录 ReentrantLock和AQS源码 总体思路 ReentrantLock#lock方法获取锁为入口 AQS acquire公平锁分析 tryAcquire分析 addWaiter分析 acquireQueued分析 selfInterrupt分析 AQS acquire非公平锁分析 ReentrantLock#unlock方法释放锁为入口 AQS release分析 tryRelease分析 unparkSuccessor分析    ReentrantLock和AQS源码(以open-jdk 1.8.0为源码分析版本) 1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * 4 * This code is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License version 2 only, as 6 * published by the Free Software Foundation. Oracle designates this 7 *

ArrayBlockingQueue的内部实现

走远了吗. 提交于 2020-03-25 01:46:13
3 月,跳不动了?>>> 区别 ArrayBlockingQueue 、ArrayList 的内部存储结构为数组;LinkedBlockingQueue 是单向链表, LinkedBlockingDeque 、 LinkedList 是双向链表 (后三者都维护链表的head与tail引用node) ArrayBlockingQueue初始化时是一定要指定容量大小;ArrayList的默认大小为0;而LinkedBlockingQueue、LinkedBlockingDeque提供默认容量Integer.MAX_VALUE。 ArrayBlockingQueue & LinkedBlockingDeque 通过同一把锁的不同Condition来控制;在操作时,生产与消费需要竞争同一把锁。 LinkedBlockingQueue通过 锁分离 方式来控制(生产与消费竞争的资源是属于独立的锁。队列空时:有生产后需要唤醒等待的消费者;队列满时:有消费后需要唤醒等待的生产者;当然对于同属生产(消费)者的不同线程相互间也需要竞争生产(消费)锁)。 实现方案 两者都是先加锁ReentrantLock, 依赖于这个锁的 [出队]等待队列 ( Condition -> notEmpty )与 【入队】等待队列( Condition -> notFull ) 来控制。 锁默认用的是非公平模式