一.定义
又名递归锁,含义是线程可以进入任何一个它已经拥有锁的所同步的代码块
二.模板
//获取外层方法(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();
}
}
四.可重入锁可以避免死锁