java 可重入锁和不可重入锁

版权声明:转载请注明出处 https://blog.csdn.net/h2604396739/article/details/86616653

概念区分

当一个线程获得当前实例的锁lock,并且进入了方法A,该线程在方法A没有释放该锁的时候,是否可以再次进入使用该锁的方法B?
不可重入锁:在方法A释放锁之前,不可以再次进入方法B
可重入锁:在方法A释放该锁之前可以再次进入方法B。
Java中的synchronized和ReentrantLock都是可重入锁。所以如果需要使用不可重入锁,则需要自己实现了。

不可重入锁的实现

public class Lock {
    
    private boolean isLocked = false;
    
    public void lock() throws InterruptedException{
        while(isLocked){//如果已经被获取锁,则当前线程只能等待
            wait();
        }
        isLocked = true;
    }
    
    public void unLock(){
        isLocked = false;
    }
}

可重入锁的实例

public class ReinnerLock {
    
    private boolean isLocked = false;
    
    Thread thread = null;//当前的线程
    
    public void lock() throws InterruptedException{
        Thread currentThread = Thread.currentThread();
        while(isLocked && thread!=currentThread){
            wait();
        }
        isLocked = true;
        thread = currentThread;
    }

    public  void unLock(){
        isLocked = false;
    }

}
public class LockClient {
//    Lock lock = new Lock();
    ReinnerLock lock = new ReinnerLock();
    void read() throws InterruptedException{
        lock.lock();
        System.out.println("read");
        read1();
        lock.unLock();
    }
    
    void read1() throws InterruptedException{
        lock.lock();
        System.out.println("read1");
        lock.unLock();
    }
    public static void main(String[] args) {
        try {
//此时执行结果为 read和read1都能打印出来
//如果使用的锁是 Lock则报IllegalMonitorStateException
            new LockClient().read();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
 

展开阅读全文

没有更多推荐了,返回首页