多线程学习--synchronized锁重入
synchronized锁重入:关键字synchronized拥有锁重入的功能,就是在使用synchronized时候,当一个线程得到一个对象锁后,在此请求此对象锁时是可以再次获取到该对象锁的,这说明了一个synchronized方法/块的内部调用本类的其他synchronized方法/块时,是永远可以得到锁的。
可重入锁概念:自己可以再次获取自己内部锁。比如由1条线程获取了某个对象锁,此时这个对象锁还没有释放,当其再次想获取这个对象锁的时候还是可以获取的,如不无法获取,就会造成死锁。
可重入锁也支持父子类继承的。
案例:
public class Service {
public synchronized void service1(){
System.out.println("service1");
service2();
}
public synchronized void service2(){
System.out.println("service2");
service3();
}
public synchronized void service3(){
System.out.println("service3");
}
public static void main(String[] args) {
Service service=new Service();
new Thread(() ->{
service.service1();
}).start();
}
}
结果:
service1
service2
service3
继承性:
public class Main {
protected int i = 10;
synchronized public void operateIinMain() {
try {
i--;
System.out.println("main print i=" + i);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Sub extends Main {
synchronized public void operateIinSub() {
try {
while (i > 0) {
i--;
System.out.println("sub print i=" + i);
Thread.sleep(100);
this.operateIinMain();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Sub sub = new Sub();
new Thread(() ->{
sub.operateIinSub();
}).start();
}
}
结果:
sub print i=9
main print i=8
sub print i=7
main print i=6
sub print i=5
main print i=4
sub print i=3
main print i=2
sub print i=1
main print i=0
还没有评论,来说两句吧...