reentrantlock

Unlocking lock owned by another thread java

久未见 提交于 2019-12-30 01:54:27
问题 I have a LockManager that manages the locks of several threads. Sometimes the threads are bad boys, and I have to kill them and ask the LockManager to release all their locks. However, since I use ReentrantLock in java this is impossible, I can not unlock a lock owned by another thread. I am forced to use Locks (cannot use semaphores, it is point of the homework). Is there any Java Lock implementation that allows me to unlock locks owned by other threads? So far the options I considered are:

java内存模型-锁

▼魔方 西西 提交于 2019-12-29 03:13:52
锁的释放-获取建立的 happens before 关系 锁是 java 并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。下面是锁释放-获取的示例代码: class MonitorExample { int a = 0; public synchronized void writer() { //1 a++; //2 } //3 public synchronized void reader() { //4 int i = a; //5 …… } //6 } 假设线程 A 执行 writer() 方法,随后线程 B 执行 reader() 方法。根据 happens before 规则,这个过程包含的 happens before 关系可以分为两类: 根据程序次序规则,1 happens before 2, 2 happens before 3; 4 happens before 5, 5 happens before 6。 根据监视器锁规则,3 happens before 4。 根据 happens before 的传递性,2 happens before 5。 上述 happens before 关系的图形化表现形式如下: 在上图中,每一个箭头链接的两个节点,代表了一个 happens before 关系

JAVA内存模型5-锁

只谈情不闲聊 提交于 2019-12-29 03:12:52
锁的释放-获取建立的happens before关系 锁是java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。下面是锁释放-获取的示例代码: class MonitorExample { int a = 0; public synchronized void writer() { //1 a++; //2 } //3 public synchronized void reader() { //4 int i = a; //5 …… } //6 } View Code   假设线程A执行writer()方法,随后线程B执行reader()方法。根据happens -before规则,这个过程包含的happens -before关系可以分为两类: 根据监视器锁规则,3happens before4。 根据程序次序规则,1happens -before2, 2 happens- before 3; 4 happens- before 5, 5 happens -before 6。 根据happens before 的传递性,2 happens before 5。    上述happens -before关系的图形化表现形式如下:   在上图中,每一个箭头链接的两个节点,代表了一个happens before关系

Java面试题13——线程安全之ReentrantLock和synchronized的面试题

妖精的绣舞 提交于 2019-12-28 02:53:14
上一篇,也就是第12篇的内容可以出好几道面试题,面试题如下 1.说说线程安全问题? 线程安全:线程安全指的是要控制多个线程对某个资源的有序访问或者修改,而这些线程之间没有冲突。 而线程安全问题指的是多个线程同时访问一个资源时产生的数据污染或者丢失的情况 产生线程安全问题的两个条件 多个线程操作共享的数据 操作共享数据的线程代码有多条 2. ReentrantLock 常见的方法有哪些? lock():用于获取锁 unlock():用于释放锁 trylock():尝试获取锁 trylock(long timeout ,TimeUnit unit);:在一定的时间内尝试去获取锁,而不是等待一段时间去获取 getHoldCount():计算lock方法的使用此时。 getQueueLength():返回正在排队等待获取此锁的线程数 isFair():是否为公平锁 3.ReentrantLock有哪些优势? 具备非阻塞方式获取锁,比如:tryLock() 可以中断所获取的锁,比如:使用interruptibly()方法,线程获得锁,会抛出异常并释放当前获得的锁。 可以在指定时间获取锁,比如:使用trylock(long timeout ,TimeUnit unit) 4.ReentrantLock怎么创建公平锁? new ReentrantLock()默认创建的为非公平锁 new

Java多线程之ReentrantLock与Condition

假如想象 提交于 2019-12-27 00:01:46
一、ReentrantLock 1、ReentrantLock简介 ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”。ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,但是添加了类似锁投票、定时锁等候和可中断锁等候的一些特性。此外,它还提供了在激烈争用情况下更佳的性能。(换句话说,当许多线程都想访问共享资源时,JVM 可以花更少的时候来调度线程,把更多时间用在执行线程上。) 顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有;而可重入的意思是,ReentrantLock锁,可以被单个线程多次获取。 ReentrantLock分为“ 公平锁 ”和“ 非公平锁 ”。它们的区别体现在获取锁的机制上是否公平。“锁”是为了保护竞争资源,防止多个线程同时操作线程而出错, ReentrantLock在同一个时间点只能被一个线程获取(当某线程获取到“锁”时,其它线程就必须等待);ReentraantLock是通过一个FIFO的等待队列来管理获取该锁所有线程的。在“公平锁”的机制下,线程依次排队获取锁;而“非公平锁”在锁是可获取状态时,不管自己是不是在队列的开头都会获取锁。 2、ReentrantLock函数列表 // 创建一个 ReentrantLock ,默认是“非公平锁”。

AQS-ReentrantLock实现原理

守給你的承諾、 提交于 2019-12-26 17:07:49
AbstractQueuedSynchronizer (AQS)类如其名,抽象的队列式同步容器,AQS定义类一套多线程访问共享资源的同步器,许多同步类的实现都依赖于它,比如之前学习的ReentrantLock/Semaphore/CountDownLatch。 1.AQS AQS阻塞队列.png 1。自定义同步器在实现时只需要实现共享资源state的获取于释放方式即可,至于具体线程等待队列的维护(如获取资源失败入队/唤醒出队等),AQS已经在顶层实现好了,自定义同步容器实现时主要实现以下几种方法: 2.isHeldExclusively():该线程是否正在独占资源,只有用到condition才需要取实现它。 3.tryAcquire(int):独占方式,尝试获取资源,成功则返回true,失败则返回false。 4.tryRelease(int):独占方式,尝试释放资源,成功则返回true,失败则返回false。 5.tryAcquireShared(int):共享方式,尝试获取资源,附属表示获取失败,0表示获取成功,但是没有剩余资源可用,其他线程不能在获取,正数表示获取成功,并且有剩余资源,也就是自己可以重复获取(可重入)。 6.tryReleaseShare(int):共享方式。尝试释放资源,成功返回true,失败返回false。 7.以ReentrantLock为例

ReentrantLock 线程安全锁的机制

放肆的年华 提交于 2019-12-25 06:56:37
1 具有线程锁的安全机制 2 可以在各个线程抢占时,线程之间切换更加频繁 代码如下 package com . exception2 ; import java . util . concurrent . locks . ReentrantLock ; import java . util . concurrent . locks . ReentrantReadWriteLock ; class Ex4 implements Runnable { private int taks = 100 ; private ReentrantLock lk = new ReentrantLock ( true ) ; @Override public void run ( ) { while ( true ) { try { lk . lock ( ) ; if ( taks > 0 ) { try { Thread . sleep ( 40 ) ; } catch ( Exception e ) { e . printStackTrace ( ) ; } System . out . println ( Thread . currentThread ( ) . getName ( ) + ":" + taks -- ) ; } else { break ; } } finally { lk

04 JDK并发包相关类

北城余情 提交于 2019-12-25 02:09:38
1 Condition Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。Condition需要结合ReentrantLock使用。 Condition的优势是支持多路等待,即可以定义多个Condition,每个condition控制线程的一条执行通路,是对传统方式的优化。传统方式只能是一路等待。 方法名称 描述 await() 当前线程进入等待状态直到被通知(signal)或者中断; 当前线程进入运行状态并从await()方法返回的场景包括: (1)其他线程调用相同Condition对象的signal/signalAll方法,并且当前线程被唤醒; (2)其他线程调用interrupt方法中断当前线程; awaitUninterruptibly() 当前线程进入等待状态直到被通知,在此过程中对中断信号不敏感,不支持中断当前线程 awaitNanos(long) 当前线程进入等待状态,直到被通知、中断或者超时。如果返回值小于等于0,可以认定就是超时了 awaitUntil(Date) 当前线程进入等待状态,直到被通知、中断或者超时。如果没到指定时间被通知

Java并发包--LinkedBlockQueue

陌路散爱 提交于 2019-12-25 02:02:41
转载请注明出处: http://www.cnblogs.com/skywang12345/p/3503458.html LinkedBlockingQueue介绍 LinkedBlockingQueue是一个单向链表实现的阻塞队列。该队列按 FIFO(先进先出)排序元素,新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。 此外,LinkedBlockingQueue还是可选容量的(防止过度膨胀),即可以指定队列的容量。如果不指定,默认容量大小等于Integer.MAX_VALUE。 LinkedBlockingQueue原理和数据结构 LinkedBlockingQueue的数据结构,如下图所示: 说明 : 1. LinkedBlockingQueue继承于AbstractQueue,它本质上是一个FIFO(先进先出)的队列。 2. LinkedBlockingQueue实现了BlockingQueue接口,它支持多线程并发。当多线程竞争同一个资源时,某线程获取到该资源之后,其它线程需要阻塞等待。 3. LinkedBlockingQueue是通过单链表实现的。 (01) head是链表的表头。取出数据时,都是从表头head处插入。 (02) last是链表的表尾。新增数据时

Making static ReentrantLocks

巧了我就是萌 提交于 2019-12-24 02:13:33
问题 I've stumbled upon this thread some time ago: Does making a reentrant lock static and make it a mutex? and I have an additional question on my own: Im interested if creating a private static final ReentrantLock lock is not considered a code smell ? I've read that static variables are evil, yet my current use case Im working on looks like ideal place to use one. Anyone care to help? Edit with details: I have this class, call it FileProcessor which does a given job in another thread. My use