Java多线程之可重入锁概念
   
    
    
    一、什么是可重入锁
   
     在java中,可重入锁分为两种,即synchronized锁以及ReentrantLock及其实现。那么,什么是重入锁呢,其实重入锁就是
    
     一个线程能否获取一个已经由它自己持有的锁
    
    。如果可以,就是可重入锁,否则为不可重入锁。它的作用就是能够避免重复获取的时候出现死锁。
   
    
    
    二、demo
   
    
    
    1、synchronized
   
public class ReentrantSynchronizer {
    public synchronized void print() {
        System.out.println(Thread.currentThread().getName());
        printf();
    }
    public synchronized void printf() {
        System.out.println(Thread.currentThread().getName());
        print();
    }
    public static void main(String[] args) {
        ReentrantSynchronizer reentrantSynchronizer = new ReentrantSynchronizer();
        for (;;){
            reentrantSynchronizer.print();
        }
    }
}
以上的demo就是测试synchronized的可重入性质,方法一中调用方法二,方法二又调用方法一,即结构类似于
synchronized(this){
  synchronized(this){
    
  }
}
结果:
main
main
main
main
main
main
...
    证明
    
     synchronized是可重入锁
    
    。
   
    
    
    2、UnReentrantLock
   
 这里用一个demo来模拟不可重入锁的特性,事实上,在JUC中都是重入锁。
public class UnReentrantLock {
    private AtomicReference<Thread> owner = new AtomicReference<>();
    public void lock() {
        Thread current = Thread.currentThread();
        for (; ; ) {
            if (owner.compareAndSet(null, current)) {
                System.err.println("EXIT");
                return;
            }
        }
    }
    public void unlock() {
        Thread current = Thread.currentThread();
        owner.compareAndSet(current, null);
    }
    public static void main(String[] args) {
        UnReentrantLock unReentrantLock=new UnReentrantLock();
        unReentrantLock.lock();
        //unReentrantLock.unlock();
        //连续两次执行lock就会造成死锁
        unReentrantLock.lock();
    }
}	
 上面我们可以看到,不可重入锁如果同一线程连续调用两次,就会造成死锁。
    
    
    3、ReentrantLock
   
 这是一个JUC的可重入锁,具体的demo 测试就交给你们去动手了,比较简单,连续两次lock看看就行。
    
    
    三、总结
   
- 可重入锁、不可重入锁,针对的对象是同一线程。
- 对于可重入锁,获取了该锁的线程可以重复获取该锁,不会造成死锁。
- 而不可重入锁,获取该锁的线程再获取该锁的时候,会等待对方释放,造成死锁。
 
版权声明:本文为rekingman原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
