显式锁ReentrantLock

本文介绍了ReentrantLock的三种使用方式,包括普通上锁与解锁、定时轮询获取锁及可中断锁获取,并对比了ReentrantLock与synchronized关键字的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用:

1)普通上锁和释放锁:
lock.lock();
	try{
		
	}finally{
		lock.unlock();
	}

2)定时的轮询,如果指定时间没有得到锁的话就会放弃,例子中的线程就会提前结束:
public class TestTryLock {
	static AtomicInteger ii = new AtomicInteger(0);
	static int lockWaitTime = 1;
	static CyclicBarrier barrier = new CyclicBarrier(10000);
	static ReentrantLock lock = new ReentrantLock();

	public static void main(String[] args){
		for(int i = 0 ; i < 10000 ; i++){
			new Thread(new t1(lock, ii , barrier)).start();;
		}
	}
	
	static class t1 implements Runnable{
		ReentrantLock lock;
		AtomicInteger i;
		CyclicBarrier barrier;
		
		public t1(ReentrantLock lock,AtomicInteger i,CyclicBarrier barrier){
			this.lock = lock;
			this.i = i;
			this.barrier = barrier;
		}
		@Override
		public void run() {
			
			
			try {
				barrier.await();
			} catch (InterruptedException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (BrokenBarrierException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			
			try {
				//这样总数不一定是10000了
				if(!lock.tryLock(lockWaitTime,TimeUnit.MILLISECONDS)){
					//指定时间没有获得所就会直接结束线程
					return;
				}
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			try{
				System.out.println(i.incrementAndGet());
			}finally{
				lock.unlock();
			}
		}
		
	}
}
输出结果肯定不会有10000.
3)可中断锁的获取,获取锁的同时会监听中断的请求:
        lock.lockInterruptibly();
	try{
		
	}finally{
		lock.unlock();
	}

和synchronized的比较:

1)灵活性:可以显式的释放锁,synchronized像一个定时炸弹,抛出异常,永远无法释放锁,释放锁还可以和异常有很好的交互。
2)简洁性:如果忘记unlock,那么是非常致命的,可能引起死锁。
3)伸缩性:线程越多,synchronized性能下降更厉害,侧面看出ReentrantLock的性能略优于内置锁。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值