重入锁--ReentrantLock

1、优势:当许多线程都在争用同一个锁时,使用 ReentrantLock 的总体开支通常要比 synchronized 少得多,同时具有很多 synchronized 没有的新特性。

2、劣势:需要谨记在finally块中释放锁,上几把就解几次。新手很容易忘记,而synchronized不需要手动解锁。【ReentrantLock不是内建锁】,发生异常不会自动释放锁。在ReentrantLock前加final

3、演示代码如下:

package reentraceLock2;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
/**
 * 优势:1、当许多线程都在争用同一个锁时,使用 ReentrantLock 的总体开支通常要比 synchronized 少得多。
 *       2、具有很多 synchronized 没有的新特性。
 * 劣势:需要谨记在finally块中释放锁,上几把就解几次。新手很容易忘记,而synchronized不需要手动解锁。
 * 【ReentrantLock不是内建锁】,发生异常不会自动释放锁。在ReentrantLock前加final
 * @author tiger
 * @Date 2017年7月27日
 */
public class ParkTest {
	public static void main(String[] args) {
		Task task = new Task();
		Thread th1 = new Thread(task,"老虎");
		Thread th2 = new Thread(task,"蓝猫");
		th1.start();
		th2.start();
	}
}
/**
 * 定义一个任务执行体,线程类。
 * @author tiger
 * @Date 2017年7月27日
 */
class Task implements Runnable{
	Park park = new Park();
	@Override
	public void run() {
		park.doLock();
	}
}
/**
 * 公园类,另外个人(线程)等待带公园(临界区)里的人(线程)出来(释放锁)后,才能进入。
 * 如果加了多把锁,只要有一把锁没有释放,则都不能进入。
 * @author tiger
 * @Date 2017年7月27日
 */
class Park{
	//【ReentrantLock不是内建锁】,发生异常不会自动释放锁.要在finally里释放锁,保证程序挂掉后锁可以被释放
	final ReentrantLock lock = new ReentrantLock();
	public void doLock(){
		String name = Thread.currentThread().getName();
		String line = null;
		System.out.println(name+ " 来到公园(临界区)门口。" );
		lock.lock();
//		synchronized ("1") {//JVM内置的同步锁,发生异常,锁会自动释放。
			try {
				System.out.println( name+" 进入公园(临界区)中,需要一张门票可以进。");
				lock.lock();
				System.out.println( name+" 进入园中园(临界区)中,要另外一张门票才可以进。");
				TimeUnit.SECONDS.sleep(2);
//				System.out.println(line.length());//会出现空指针异常
			} catch (InterruptedException e) {
				e.printStackTrace();
			}finally {
				//解开第一把锁
				lock.unlock();//保证锁可以被释放
				//解开第二把锁
				lock.unlock();
			}
//		}
		System.out.println( name+" 玩耍结束!");
	}
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ljt-tiger

thanks

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值