可重入锁:
可重复可递归调用的锁,也就是说在外层使用锁之后,在内层也可以使用外层的锁,并且不会发生死锁
ReentrantLock和synchronized都是可重入锁
import java.util.concurrent.TimeUnit;
public class ReenterLockDemo {
public static void main(String[] args) {
Phone phone = new Phone();
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "\t我进来了");
phone.sendSMS();
}, "AA").start();
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "\t我进来了");
phone.sendEmail();
}, "BB").start();
}
}
class Phone {
public void sendSMS() {
synchronized (this) {
System.out.println(Thread.currentThread().getName() + "准备发送信息");
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
sendEmail();
System.out.println(Thread.currentThread().getName() + "发送信息完毕");
}
}
public void sendEmail() {
synchronized (this) {
System.out.println(Thread.currentThread().getName() + "准备发送邮件");
System.out.println(Thread.currentThread().getName() + "发送邮件完毕");
}
}
}
降维说明:
可重入锁是在执行一个方法时,已经获得锁了,这个方法调用另外一个也是需要已获得锁方法,就不需要再释放锁,而是直接执行。其他线程需要等着。