Synchronized的可重入性实例 ----笔记
例一 同一类的同一方法
public class SynchronizedReusing {
public static void main(String[] args) {
SynchronizedReusing reusing = new SynchronizedReusing();
reusing.method(0);
}
public synchronized void method(int i){
if(i==1){
System.out.println(i++);
return;
}
System.out.println(i++);
method(i);
}
}
输出结果:
0
1
Process finished with exit code 0
分析:因为方法被synchronized修饰,如果不可重入的话,无法执行递归,输出0和1代表进入了两次method方法,说明了Synchronized的可重用性。
例二 同一类的不同方法
public class SynchronizedReusing {
public static void main(String[] args) {
SynchronizedReusing reusing = new SynchronizedReusing();
reusing.method(0);
}
public synchronized void method(int i){
System.out.println("method " + i++);
method1(i);
}
public synchronized void method1(int i){
System.out.println("method1 " + i);
}
}
输出结果:
method 0
method1 1
Process finished with exit code 0
分析:两个方法都被synchronized修饰,如果不可重入的话,method是无法访问method1的(死锁),说明了Synchronized的可重用性。
例三 不同类的方法
public class SynchronizedReusing {
public synchronized void method(){
System.out.println("父类的方法");
}
}
class SynchronizedReusingSon extends SynchronizedReusing {
@Override
public synchronized void method() {
System.out.println("子类的方法");
super.method();
}
public static void main(String[] args) {
SynchronizedReusingSon son = new SynchronizedReusingSon();
son.method();
}
}
输出结果:
子类的方法
父类的方法
Process finished with exit code 0
不同类也是可以重入的
分析:同一线程内,synchronized是可重入的。