可重入锁和不可重入锁

可重入锁和不可重入锁

概念区分

当一个线程获得当前实例的锁lock,并且进入了方法A,该线程在方法A没有释放该锁的时候,是否可以再次进入使用该锁的方法B?

不可重入锁:在方法A释放锁之前,不可以再次进入方法B

可重入锁:在方法A释放该锁之前可以再次进入方法B;如ReentrantLock和synchronized

原理分析

不可重入锁的实现:

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;

    

    Threadthread =null;//当前的线程

    

    public void lock()throws InterruptedException{

        ThreadcurrentThread = Thread.currentThread();

        while(isLocked &&thread!=currentThread){

            wait();

        }

        isLocked =true;

        thread =currentThread;

    }

 

    public  void unLock(){

        isLocked =false;

    }

 

}

public class LockClient {

//    Lock lock = new Lock();

    ReinnerLocklock =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 {

//此时执行结果为readread1都能打印出来

//如果使用的锁是 Lock则报IllegalMonitorStateException

            new LockClient().read();

        }catch (InterruptedExceptione) {

            e.printStackTrace();

        }

    }

}

 


版权声明:本文为h2604396739原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。