上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()更不会被调用。