可重入锁

本文解析了Java中ReentrantLock如何实现可重入性,通过实例展示了如何在TestLock类中正确使用它,以及在doSomething方法中为何不可重入。重点在于synchronized关键字的使用和互斥锁的持有计数机制。
摘要由CSDN通过智能技术生成

java中用synchronized实现可重入锁的基本原理

package Thread;
//可重入锁(使得再得到一个锁时 不会等待 然后这个锁可以继续使用)
public class TestLock {
Relock lock = new Relock();
public void a() throws InterruptedException {
lock.lock();
System.out.println(lock.getHoldCount());
doSomething();
lock.unlock();
System.out.println(lock.getHoldCount());
}
//不可重入
public void doSomething() throws InterruptedException {
lock.lock();
System.out.println(lock.getHoldCount());
lock.unlock();
System.out.println(lock.getHoldCount());
}
public static void main(String[] args) throws InterruptedException {
TestLock test = new TestLock();
test.a();
Thread.sleep(1000);
System.out.println(test.lock.getHoldCount());
}
}
//可重入锁
class Relock{
//是否占用
private boolean isLocked = false;
private Thread lockedBy = null;//存储线程
private int holdCount = 0;
//使用锁
public synchronized void lock() throws InterruptedException {
Thread t = Thread.currentThread();
while(isLocked && lockedBy!= t) {
wait();
}
isLocked = true;
lockedBy = t;
holdCount ++;
}
//释放锁
public synchronized void unlock() {
if(Thread.currentThread() == lockedBy) {
holdCount–;
if(holdCount == 0) {
isLocked = false;
notify();
lockedBy = null;
}
}

}
public int getHoldCount() {
	return holdCount;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值