Java多线程编程核心技术(第3版)
上QQ阅读APP看书,第一时间看更新

2.1.7 synchronized锁重入

关键字synchronized拥有重入锁的功能,即在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象锁的。这也证明在一个synchronized方法/块的内部调用本类的其他synchronized方法/this块时,是永远可以得到锁的。

创建实验项目synLockIn_1,类Service.java代码如下:


package myservice;

public class Service {

synchronized public void service1() {
    System.out.println("service1");
    service2();
}

synchronized public void service2() {
    System.out.println("service2");
    service3();
}

synchronized public void service3() {
    System.out.println("service3");
}

}

线程类MyThread.java代码如下:


package extthread;

import myservice.Service;

public class MyThread extends Thread {
@Override
public void run() {
    Service service = new Service();
    service.service1();
}

}

运行类Run.java代码如下:


package test;

import extthread.MyThread;

public class Run {
public static void main(String[] args) {
    MyThread t = new MyThread();
    t.start();
}
}

程序运行结果如图2-13所示。

图2-13 运行结果

“可重入锁”是指自己可以再次获取自己的内部锁。例如,有1个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象锁时还是可以获取的。如果不可重入锁,方法service2()不会被调用,方法service3()更不会被调用。