可重入锁
指的是同一线程外层函数获得锁之后,内层递归函数仍能获取该锁的代码,在同一线程的外层获取锁的时候,在进入内层方法会自动获取锁,也就是说线程可以任意进入它已经拥有的锁的同步代码块。
synchronized 是一个典型的重入锁
使用synchronized 实现代码如下:
public class ReenterLockDemo {
public static void main(String[] args) {
Phone phone = new Phone();
new Thread(new Runnable() {
@Override
public void run() {
try {
phone.sendSMS();
} catch (Exception e) {
e.printStackTrace();
}
}
},"t1").start();
new Thread(new Runnable() {
@Override
public void run() {
try {
phone.sendSMS();
} catch (Exception e) {
e.printStackTrace();
}
}
},"t2").start();
}
}
class Phone{
public synchronized void sendSMS () throws Exception{
System.out.println(Thread.currentThread().getName() + "sendSmS");
sendEmail();
}
public synchronized void sendEmail () throws Exception{
System.out.println(Thread.currentThread().getName() + "sendEmail");
}
}
运行结果如下:
从运行结果可看到t1线程在获取到锁对象时递归里的锁方法还能继续获取锁对象。