ReentrantLock学习笔记

来源:互联网 发布:vmware for ubuntu 32 编辑:程序博客网 时间:2024/04/30 00:33

官方解释:

一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。


ReentrantLock 将由最近成功获得锁,并且还没有释放该锁的线程所拥有。当锁没有被另一个线程所拥有时,调用 lock 的线程将成功获取该锁并返回。如果当前线程已经拥有该锁,此方法将立即返回。可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。


此类的构造方法接受一个可选的公平 参数。当设置为 true 时,在多个线程的争用下,这些锁倾向于将访问权授予等待时间最长的线程。否则此锁将无法保证任何特定访问顺序。与采用默认设置(使用不公平锁)相比,使用公平锁的程序在许多线程访问时表现为很低的总体吞吐量(即速度很慢,常常极其慢),但是在获得锁和保证锁分配的均衡性时差异较小。不过要注意的是,公平锁不能保证线程调度的公平性。因此,使用公平锁的众多线程中的一员可能获得多倍的成功机会,这种情况发生在其他活动线程没有被处理并且目前并未持有锁时。还要注意的是,未定时的 tryLock 方法并没有使用公平设置。因为即使其他线程正在等待,只要该锁是可用的,此方法就可以获得成功。


主要方法:

 intgetHoldCount()           查询当前线程保持此锁的次数。protected  ThreadgetOwner()           返回目前拥有此锁的线程,如果此锁不被任何线程拥有,则返回 null。protected  Collection<Thread>getQueuedThreads()           返回一个 collection,它包含可能正等待获取此锁的线程。 intgetQueueLength()           返回正等待获取此锁的线程估计数。protected  Collection<Thread>getWaitingThreads(Condition condition)           返回一个 collection,它包含可能正在等待与此锁相关给定条件的那些线程。 intgetWaitQueueLength(Condition condition)           返回等待与此锁相关的给定条件的线程估计数。 booleanhasQueuedThread(Thread thread)           查询给定线程是否正在等待获取此锁。 booleanhasQueuedThreads()           查询是否有些线程正在等待获取此锁。 booleanhasWaiters(Condition condition)           查询是否有些线程正在等待与此锁有关的给定条件。 booleanisFair()           如果此锁的公平设置为 true,则返回 true。 booleanisHeldByCurrentThread()           查询当前线程是否保持此锁。 booleanisLocked()           查询此锁是否由任意线程保持。 voidlock()           获取锁。 voidlockInterruptibly()           如果当前线程未被中断,则获取锁。 ConditionnewCondition()           返回用来与此 Lock 实例一起使用的 Condition 实例。 StringtoString()           返回标识此锁及其锁定状态的字符串。 booleantryLock()           仅在调用时锁未被另一个线程保持的情况下,才获取该锁。 booleantryLock(long timeout, TimeUnit unit)           如果锁在给定等待时间内没有被另一个线程保持,且当前线程未被中断,则获取该锁。 voidunlock()           试图释放此锁。


代码实例:

package com.bennytian.test;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.locks.ReentrantLock;/** * @author BennyTian * @date 2015年8月28日 上午11:11:20 */public class TestReentrantLock {public static void main(String[] args) throws Exception {ReentrantLock lock = new ReentrantLock();ExecutorService service = Executors.newCachedThreadPool();for (int i = 0; i < 10; i++) {service.execute(new ReentrantLockWorker(i, lock));}service.shutdown();}}class ReentrantLockWorker implements Runnable{private int id;private ReentrantLock lock ;public ReentrantLockWorker(int id,ReentrantLock lock) {this.id = id;this.lock = lock;}@Overridepublic void run() {try {System.out.println("[id="+id+"] 准备干活,等待锁:" + System.currentTimeMillis());lock.lock();System.out.println("[id="+id+"] 开始干活:" + System.currentTimeMillis());Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();} finally{System.out.println("[id="+id+"] 干活完毕,释放锁:" + System.currentTimeMillis());lock.unlock();}}}



0 0
原创粉丝点击