可重入锁

suaxi
2021-02-23 / 0 评论 / 144 阅读 / 正在检测是否收录...

可重入锁

1.可重入锁概念.png

可重入锁:打开大门的锁之后也就获得了里面两个房间的锁


synchronized版可重入锁
package com.sw.lock;

/**
 * @Author suaxi
 * @Date 2021/2/22 23:07
 * synchronized版可重入锁
 */
public class Test01 {
    public static void main(String[] args) {
        Phone phone = new Phone();

        new Thread(() ->{
            phone.sms();
        },"A").start();

        new Thread(() ->{
            phone.sms();
        },"B").start();
    }
}

class Phone{
    public synchronized void sms(){
        System.out.println(Thread.currentThread().getName()+"--->sms");
        call();
    }

    public synchronized void call(){
        System.out.println(Thread.currentThread().getName()+"--->call");
    }
}


lock版可重入锁
package com.sw.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @Author suaxi
 * @Date 2021/2/22 23:07
 * lock版可重入锁
 */
public class Test02 {
    public static void main(String[] args) {
        Phone2 phone = new Phone2();

        new Thread(() ->{
            phone.sms();
        },"A").start();

        new Thread(() ->{
            phone.sms();
        },"B").start();
    }
}

class Phone2{
    Lock lock =new ReentrantLock();

    public void sms(){
        lock.lock(); //lock锁必须配对,否则会产生死锁
        try {
            System.out.println(Thread.currentThread().getName()+"--->sms");
            call();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }

    }

    public void call(){
        lock.lock();
        try {
        System.out.println(Thread.currentThread().getName()+"--->call");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
}
0

评论 (0)

取消