关键词synchronized拥有锁重入的功能,也就是在使用synchronized时,当一个线程得到对象锁时,再次请求这个对象锁是可以再次得到的。这也证明在一个synchronized方法/块的内部调用其他的synchronized方法/代码块是永远可以得到锁的。如果锁不可以重入,那么调用其他的同步方法会阻塞,就会造成死锁。
public class SyschronizedObject {
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");
}
}
public class MyThread extends Thread {
private SyschronizedObject object;
public MyThread(SyschronizedObject object) {
super();
this.object = object;
}
@Override
public void run() {
super.run();
object.service1();
}
}
public class TestMyThread {
public static void main(String[] args) {
SyschronizedObject object = new SyschronizedObject();
MyThread thread1 = new MyThread(object);
thread1.start();
}
}
可重入锁还可以发生在继承关系中。
当出现异常,线程所持有的锁自动释放,其他线程正常执行。
同步方法不具有继承性。继承的方法中必须加上synchronized关键字