可重入锁的使用及实现

锁重入

  • 锁重入的功能,当一个线程得到一个对象的锁后,在该锁里执行代码的时候如果再次请求该对象的锁时可以再次得到该对象的锁;当线程请求一个由其他线程持有的对象锁时,该线程会组阻塞,而当线程请求有自己持有的对象锁时,如果该锁是重入锁,请求就会成功,否则阻塞;

简单实现

  • 不可重入锁
package lockDemo;

public class MyLock1 {
    private  boolean flag=false;

    public  void lock() throws InterruptedException {
        while (flag){ //如果flag为true,即该锁已被其他线程获得则当前线程阻塞
            wait();
        }
        flag=true;
    }
    public  void unlock(){
        flag=false;
        notify();
    }
}
  • 可重入锁
package lockDemo;

public class MyLock2 {
    private boolean flag=false;
    private Thread thread=null; //当前的线程

    public  void lock() throws InterruptedException {
        Thread currentThread = Thread.currentThread();
        while (flag&&thread!=currentThread){ //如果并且线程不是当前获取锁的线程,则等待
            wait();
        }
        flag=true;
        thread=currentThread;
    }

    public void unlock(){
        flag=false;
        notify();
    }
}

测试:

package lockDemo;

public class LockTest {
    public MyLock1 lock=new MyLock1();

    public void m1() throws InterruptedException {
        lock.lock();
        System.out.println("第一次加锁");
        addLock(); //如果是不可重入锁,则会被阻塞
        System.out.println("我是可重入锁");
        lock.unlock();
    }

    public void addLock() throws InterruptedException {
        lock.lock();
        System.out.println("再次加锁");
        lock.unlock();
    }

    public static void main(String[] args) throws InterruptedException {
        LockTest lt = new LockTest();
        lt.m1();
    }
}

猜你喜欢

转载自blog.csdn.net/mashaokang1314/article/details/88217911
今日推荐