可重入锁

一.定义
又名递归锁,含义是线程可以进入任何一个它已经拥有锁的所同步的代码块

二.模板

//获取外层方法(fun1)的锁后会自动获取内层的锁(fun2)
public synchronized void fun1(){fun2();}
public synchronized void fun2() {}

三.synchronized 和ReentrantLock都是可重入锁
1.演示synchronized方法是可重入锁

//演示synchronized方法是可重入锁
/*
运行结果: 
Thread 1+"\t -----invoked sendSMS()"
Thread 1+"\t +++++invoked sendEmail()",这里就是外层函数调用内层函数
Thread 2+"\t -----invoked sendSMS()"
Thread 2+"\t +++++invoked sendEmail()"
*/
class Phone{
    public synchronized void sendSMS()throws Exception{
        System.out.println(Thread.currentThread().getName()+"\t -----invoked sendSMS()");
        Thread.sleep(3000);
        sendEmail();//外层函数调内层函数
    }

    public synchronized void sendEmail() throws Exception{
        System.out.println(Thread.currentThread().getName()+"\t +++++invoked sendEmail()");
    }
}

public static void main(String[] args) {
        Phone phone = new Phone();
        new Thread(() -> {
            try {
                phone.sendSMS();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "Thread 1").start();
        new Thread(() -> {
            try {
                phone.sendSMS();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "Thread 2").start();
    }
}

2.演示ReentrantLock是可重入锁

/*
    A---sendEmail
    A---sendPicture
    B---sendEmail
    B---sendPicture
*/
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class phone{
    Lock lock= new ReentrantLock();
    public void senEmail()
    {
        lock.lock();
        try{
            System.out.println(Thread.currentThread().getName()+"---sendEmail");
            sendPicture();
        }finally{
           lock.unlock();
        }
    }
    public void sendPicture()
    {
        lock.lock();
        try{
            System.out.println(Thread.currentThread().getName()+"---sendPicture");
        }finally{
            lock.unlock();
        }
    }

}

public class ss {
    public static void main(String[] args) {
        phone p=new phone();
        new Thread(()->{
            p.senEmail();
        },"A").start();

        new Thread(()->{
            p.senEmail();
        },"B").start();
    }
}

四.可重入锁可以避免死锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值