多线程学习--synchronized锁重入

Dear 丶 2023-10-27 07:07 218阅读 0赞
  1. synchronized锁重入:关键字synchronized拥有锁重入的功能,就是在使用synchronized时候,当一个线程得到一个对象锁后,在此请求此对象锁时是可以再次获取到该对象锁的,这说明了一个synchronized方法/块的内部调用本类的其他synchronized方法/块时,是永远可以得到锁的。

可重入锁概念:自己可以再次获取自己内部锁。比如由1条线程获取了某个对象锁,此时这个对象锁还没有释放,当其再次想获取这个对象锁的时候还是可以获取的,如不无法获取,就会造成死锁。

可重入锁也支持父子类继承的。

案例:

  1. public class Service {
  2. public synchronized void service1(){
  3. System.out.println("service1");
  4. service2();
  5. }
  6. public synchronized void service2(){
  7. System.out.println("service2");
  8. service3();
  9. }
  10. public synchronized void service3(){
  11. System.out.println("service3");
  12. }
  13. public static void main(String[] args) {
  14. Service service=new Service();
  15. new Thread(() ->{
  16. service.service1();
  17. }).start();
  18. }
  19. }

结果:

  1. service1
  2. service2
  3. service3

继承性:

  1. public class Main {
  2. protected int i = 10;
  3. synchronized public void operateIinMain() {
  4. try {
  5. i--;
  6. System.out.println("main print i=" + i);
  7. Thread.sleep(100);
  8. } catch (InterruptedException e) {
  9. e.printStackTrace();
  10. }
  11. }
  12. }
  13. public class Sub extends Main {
  14. synchronized public void operateIinSub() {
  15. try {
  16. while (i > 0) {
  17. i--;
  18. System.out.println("sub print i=" + i);
  19. Thread.sleep(100);
  20. this.operateIinMain();
  21. }
  22. } catch (InterruptedException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. public static void main(String[] args) {
  27. Sub sub = new Sub();
  28. new Thread(() ->{
  29. sub.operateIinSub();
  30. }).start();
  31. }
  32. }

结果:

  1. sub print i=9
  2. main print i=8
  3. sub print i=7
  4. main print i=6
  5. sub print i=5
  6. main print i=4
  7. sub print i=3
  8. main print i=2
  9. sub print i=1
  10. main print i=0

发表评论

表情:
评论列表 (有 0 条评论,218人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线-可

    3.4 可重入锁(递归锁) 3.4.1 概念说明 是指在同一线程在外层方法获取到锁的时侯,在进入该线程的内层方法会自动获取锁(前提,锁对 象的是同一个对象),不会因为之前

    相关 Synchronize

    Synchronize锁重入 拥有锁重入的功能 就是在使用synchronize时,当一个线程得到了一个对象的锁之后 再次,请求该对象时,可以再次得到该对象的锁