可重入锁

作者: 南乡清水 | 来源:发表于2018-03-05 09:55 被阅读26次

    可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。比如ReentrantLock 和synchronized 都是 可重入锁

    直接放代码

    
    public class SubService {
    
    ReentrantLock lock = new ReentrantLock();
    
    public void subService1() {
    
        lock.lock();
    
        System.out.println("thread = " + Thread.currentThread().getId() + " --subService1");
    
        subService2();
    
        lock.unlock();
    
    }
    
    public synchronized void subService2() {
    
        System.out.println("thread = " + Thread.currentThread().getId() + " --subService2");
    
    }
    
    }
    
    public class Service extends SubService {
    
    public synchronized void service1(){
    
        System.out.println("thread = " + Thread.currentThread().getId() + " --service1");
    
        service2();
    
    }
    
    public synchronized void service2() {
    
        System.out.println("thread = " + Thread.currentThread().getId() + " --service2");
    
        service3();
    
    }
    
    public synchronized void service3() {
    
        System.out.println("thread = " + Thread.currentThread().getId() + " --service3");
    
        this.subService1();
    
    }
    
    }
    
    public class MyThread extends Thread {
    
    @Override
    
    public void run() {
    
        Service service = new Service();
    
        service.service1();
    
    }
    
    public static void main(String[] args) throws Exception {
    
        MyThread thread1 = new MyThread();
    
        thread1.start();
    
        MyThread thread2 = new MyThread();
    
        thread2.start();
    
    }
    
    } 
    
    

    运行结果

    image

    通过测试,可以得知 ReentrantLock 和synchronized锁是可以重入的,且在父子类继承环境中同样有效,如果该类型锁不可重入,则在调用service1()方法的时候,应该发生死锁,结果是同一线程的锁内部函数中锁可以重入。

    来源 :

    java多线程编程核心技术

    Java锁的种类以及辨析(四):可重入锁 http://ifeve.com/java_lock_see4/

    相关文章

      网友评论

      • 极客小姑凉:可重入锁,一般获取锁的时候,看当前线程时候就是获取锁的线程
        南乡清水:是的,比如上面的ReentrantLock,你可以看下redission可重入锁的实现,蛮有意思的

      本文标题:可重入锁

      本文链接:https://www.haomeiwen.com/subject/dloqfftx.html