java可重入锁与不可重入锁

本文详细介绍了不可重入锁和可重入锁的概念及实现方式,通过具体代码示例展示了两种锁的工作原理。不可重入锁防止同一时间多个线程进入临界区,而可重入锁允许同一线程多次获取锁而不阻塞。

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

1、不可重入锁

public class LockTest01 {
	private Lock lock = new Lock();
	
	//做一些事情
	public void doSomethings() throws InterruptedException {
		lock.lock();
		a();
		lock.unlock();
	}
	
	//在做一些事情
	public void a() throws InterruptedException {
		lock.lock();
		//......................
		lock.unlock();
	}

	public static void main(String[] args) throws InterruptedException {
		LockTest01 lt = new LockTest01();
		//会忙等
//		lt.doSomethings();
		lt.a();
	}

}

//自定义锁
class Lock {
	//判断锁是否被使用
	//F 没有被使用 
	//T 正在被使用
	private boolean isLock = false;
	
	//上锁
	public synchronized void lock() throws InterruptedException {
		//若果被锁上了,就等待
		while(isLock) {
			wait();
		}
		//如果没有被锁上,就加锁
		isLock = true;
	}
	
	//开锁
	public synchronized void unlock() {
		isLock = false;
		notify();
	}
}

2、可重入锁

public class LockTest02 {
	private Relock lock = new Relock();
	
	//做一些事情
	public void doSomethings() throws InterruptedException {
		lock.lock();
		System.out.println(lock.getCount());
		a();
		lock.unlock();
		System.out.println(lock.getCount());
	}
	
	//在做一些事情
	public void a() throws InterruptedException {
		lock.lock();
		System.out.println(lock.getCount());
		//......................
		lock.unlock();
		System.out.println(lock.getCount());
	}

	public static void main(String[] args) throws InterruptedException {
		LockTest02 lt = new LockTest02();
		//会忙等
		lt.doSomethings();
		System.out.println(lt.lock.getCount());
//		lt.a();
	}

}

//自定义锁
class Relock {
	//判断锁是否被使用
	//F 没有被使用 
	//T 正在被使用
	private boolean isLock = false;
	
	//计数器
	private int holdCount = 0;
	
	//记录当前线程
	private Thread lockBy = null;
	
	//上锁
	public synchronized void lock() throws InterruptedException {
		//保存
		Thread t = Thread.currentThread();
		//若果被锁上了,就等待
		while(isLock && lockBy != t) {
			wait();
		}
		//如果没有被锁上,就加锁
		isLock = true;
		holdCount++;
		lockBy = t;
	}
	
	//开锁
	public synchronized void unlock() {
		//保证是当前线程
		if (lockBy == Thread.currentThread()) {
			holdCount--;
			if (holdCount == 0) {
				isLock = false;
				lockBy = null;
				notify();
			}
		}
	}

	public int getCount() {
		return holdCount;
	}
	
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值