ReentrantLock学习笔记

官方解释:

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


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


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


主要方法:

 int	getHoldCount() 
          查询当前线程保持此锁的次数。
protected  Thread	getOwner() 
          返回目前拥有此锁的线程,如果此锁不被任何线程拥有,则返回 null。
protected  Collection<Thread>	getQueuedThreads() 
          返回一个 collection,它包含可能正等待获取此锁的线程。
 int	getQueueLength() 
          返回正等待获取此锁的线程估计数。
protected  Collection<Thread>	getWaitingThreads(Condition condition) 
          返回一个 collection,它包含可能正在等待与此锁相关给定条件的那些线程。
 int	getWaitQueueLength(Condition condition) 
          返回等待与此锁相关的给定条件的线程估计数。
 boolean	hasQueuedThread(Thread thread) 
          查询给定线程是否正在等待获取此锁。
 boolean	hasQueuedThreads() 
          查询是否有些线程正在等待获取此锁。
 boolean	hasWaiters(Condition condition) 
          查询是否有些线程正在等待与此锁有关的给定条件。
 boolean	isFair() 
          如果此锁的公平设置为 true,则返回 true。
 boolean	isHeldByCurrentThread() 
          查询当前线程是否保持此锁。
 boolean	isLocked() 
          查询此锁是否由任意线程保持。
 void	lock() 
          获取锁。
 void	lockInterruptibly() 
          如果当前线程未被中断,则获取锁。
 Condition	newCondition() 
          返回用来与此 Lock 实例一起使用的 Condition 实例。
 String	toString() 
          返回标识此锁及其锁定状态的字符串。
 boolean	tryLock() 
          仅在调用时锁未被另一个线程保持的情况下,才获取该锁。
 boolean	tryLock(long timeout, TimeUnit unit) 
          如果锁在给定等待时间内没有被另一个线程保持,且当前线程未被中断,则获取该锁。
 void	unlock() 
          试图释放此锁。


代码实例:

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;
	}

	@Override
	public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值