Skip to content

服务器托管,北京服务器托管,服务器租用-价格及机房咨询

Menu
  • 首页
  • 关于我们
  • 新闻资讯
  • 数据中心
  • 服务器托管
  • 服务器租用
  • 机房租用
  • 支持中心
  • 解决方案
  • 联系我们
Menu

synchronized(this)理解

Posted on 2023年9月19日2023年9月19日 by hackdl

1、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

2、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问object中的非synchronized(this)同步代码块。

3、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其他synchronized(this)同步代码块得访问将被阻塞。

4、第三个例子同样适用其他同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其他线程对该object对象所有同步代码部分的访问都将被暂时阻塞。

5、以上规则对其他对象锁同样适用

 

一、

1. public class Thread1 implements
2.   
3. /**
4.      * 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。
5.      * 另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块
6.      * @param args
7.      */
8. public static void
9. new
10. new Thread(t1,"A");  
11. new Thread(t1,"B");  
12.         ta.start();  
13.         tb.start();  
14.     }  
15.   
16. @Override
17. public void
18. synchronized(this){  
19. for(int i=0;i

执行结果:

     A synchronized loop 0
     A synchronized loop 1
     A synchronized loop 2
     A synchronized loop 3
     A synchronized loop 4
     B synchronized loop 0
     B synchronized loop 1
     B synchronized loop 2
     B synchronized loop 3

     B synchronized loop 4

二、

    1. package
    2.   
    3. public class Thread2 implements
    4.   
    5. /**
    6.      * 然而,当一个线程访问object的一个synchronized(this)同步代码块时,
    7.      * 另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
    8.      * @param args
    9.      */
    10. public static void
    11. final Thread2 myt2=new
    12. new
    13. new
    14. public void
    15.                 myt2.m4t1();  
    16.             }  
    17. "t1"
    18.         );  
    19. new
    20. new
    21. public void
    22.                         myt2.m4t2();  
    23.                     }  
    24. "t2"
    25.                 );  
    26.         t1.start();  
    27.         t2.start();  
    28.     }  
    29. public void
    30. synchronized(this){  
    31. int i=5;  
    32. while(i-->0){  
    33. " : "+i);  
    34.             }  
    35. try
    36. 500);  
    37. catch
    38.                 e.printStackTrace();  
    39.             }  
    40.         }  
    41.     }  
    42. public void
    43. int i=5;  
    44. while(i-->0){  
    45. " : "+i);  
    46.         }  
    47. try
    48. 500);  
    49. catch
    50.             e.printStackTrace();  
    51.         }  
    52.     }  
    53. @Override
    54. public void
    55.           
    56.     }  
    57.   
    58. }

     

     执行结果:

         t1 : 4
         t1 : 3
         t1 : 2
         t1 : 1
         t2 : 4
         t2 : 3
         t2 : 2
         t2 : 1
         t2 : 0
         t1 : 0

     

    三、

    1. package
    2.   
    3. public class
    4.   
    5. /**
    6.      * 三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,
    7.      * 其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
    8.      * @param args
    9.      */
    10. public static void
    11. final Thread3 myt2=new
    12. new
    13. new
    14. public void
    15.                 myt2.m4t1();  
    16.             }  
    17. "Thread3_t1"
    18.         );  
    19. new
    20. new
    21. public void
    22.                         myt2.m4t2();  
    23.                     }  
    24. "Thread3_t2"
    25.                 );  
    26.         t1.start();  
    27.         t2.start();  
    28.     }  
    29. public void
    30. synchronized(this){  
    31. int i=5;  
    32. while(i-->0){  
    33. " : "+i);  
    34.             }  
    35. try
    36. 500);  
    37. catch
    38.                 e.printStackTrace();  
    39.             }  
    40.         }  
    41.     }  
    42. public void
    43. synchronized(this){  
    44. int i=5;  
    45. while(i-->0){  
    46. " : "+i);  
    47.             }  
    48. try
    49. 500);  
    50. catch
    51.                 e.printStackTrace();  
    52.             }  
    53.         }  
    54.           
    55.     }  
    56. }

     执行结果:

     

         Thread3_t1 : 4
         Thread3_t1 : 3
         Thread3_t1 : 2
         Thread3_t1 : 1
         Thread3_t1 : 0
         Thread3_t2 : 4
         Thread3_t2 : 3
         Thread3_t2 : 2
         Thread3_t2 : 1
         Thread3_t2 : 0 

     

    四、

      1. package
      2.   
      3. public class
      4.   
      5. /**
      6.      * 四、第三个例子同样适用其它同步代码块。
      7.      * 也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。
      8.      * 结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
      9.      * @param args
      10.      */
      11. public static void
      12. final Thread4 myt4=new
      13. new
      14. new
      15. public void
      16.                 myt4.m4t1();  
      17.             }  
      18. "Thread4_t1"
      19.         );  
      20. new
      21. new
      22. public void
      23.                         myt4.m4t2();  
      24.                     }  
      25. "Thread4_t2"
      26.                 );  
      27.         t1.start();  
      28.         t2.start();  
      29.     }  
      30. public void
      31. synchronized(this){  
      32. int i=5;  
      33. while(i-->0){  
      34. " : "+i);  
      35.             }  
      36. try
      37. 500);  
      38. catch
      39.                 e.printStackTrace();  
      40.             }  
      41.         }  
      42.     }  
      43. public synchronized void
      44. int i=5;  
      45. while(i-->0){  
      46. " : "+i);  
      47.             }  
      48. try
      49. 500);  
      50. catch
      51.                 e.printStackTrace();  
      52.             }  
      53.           
      54.     }  
      55. }

       

      执行结果:

           Thread4_t1 : 4
           Thread4_t1 : 3
           Thread4_t1 : 2
           Thread4_t1 : 1
           Thread4_t1 : 0
           Thread4_t2 : 4
           Thread4_t2 : 3
           Thread4_t2 : 2
           Thread4_t2 : 1
           Thread4_t2 : 0

       

       五、

      1. package

      1. public class

      1. /**
      2.   * @param args
      3.   */
      4. public static void
      5. final Thread5 myt5=new
      6. final Inner inner=myt5.new
      7. new Thread(new
      8. public void
      9.     myt5.m4t1(inner);  
      10.    }  
      11. "Thread5_t1"
      12.      );  
      13. new Thread(new
      14. public void
      15.     myt5.m4t2(inner);  
      16.    }  
      17. "Thread5_t2"
      18.      );  
      19.   t1.start();  
      20.   t2.start();  
      21.  }  
      22. class
      23. private void
      24. int i=5;  
      25. while(i-->0){  
      26. ":Inner.m4t1()="+i);  
      27. try{  
      28. 500);  
      29. catch(Exception e){  
      30.           
      31.        }  
      32.       }  
      33.      }  
      34. private void
      35. int i=5;  
      36. while(i-->0){  
      37. ":Inner.m4t2()="+i);  
      38. try{  
      39. 500);  
      40. catch(Exception e){    
      41.              }  
      42.          }  
      43.         }  
      44.     }  
      45. private void
      46. synchronized(inner){//使用对象锁
      47.      inner.m4t1();  
      48.      }  
      49.     }  
      50. private void
      51.      inner.m4t2();  
      52.     }  
      53.       
      54. }

       

      执行结果:

      (尽管t1获得了对Inner的对象锁,但由于线程t2 访问的是同一个inner的非同步部分。所所以两个线程互不干扰)

           Thread5_t1:Inner.m4t1()=4
           Thread5_t2:Inner.m4t2()=4
           Thread5_t2:Inner.m4t2()=3
           Thread5_t1:Inner.m4t1()=3
           Thread5_t2:Inner.m4t2()=2
           Thread5_t1:Inner.m4t1()=2
           Thread5_t2:Inner.m4t2()=1
           Thread5_t1:Inner.m4t1()=1
           Thread5_t1:Inner.m4t1()=0
           Thread5_t2:Inner.m4t2()=0

       

      现在在Inner.m4t2()前面加上synchronized:

      (尽管t1与t2访问了同一个对象中两个毫不相干的部分,但因为t1先获得了对对象Inner的对象锁,所以t2对Inner.m4t2()的访问也被阻塞,因为m4t2()是Inner中的一个同步方法)

           Thread5_t1:Inner.m4t1()=4
           Thread5_t1:Inner.m4t1()=3
           Thread5_t1:Inner.m4t1()=2
           Thread5_t1:Inner.m4t1()=1
           Thread5_t1:Inner.m4t1()=0
           Thread5_t2:Inner.m4t2()=4
           Thread5_t2:Inner.m4t2()=3
           Thread5_t2:Inner.m4t2()=2
           Thread5_t2:Inner.m4t2()=1
           Thread5_t2:Inner.m4t2()=0

       

      服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
      机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net

      相关推荐: C++面试八股文:什么是RAII?

      某日二师兄参加XXX科技公司的C++工程师开发岗位第13面: 面试官:什么是RAII? 二师兄:RAII是Resource Acquisition Is Initialization的缩写。翻译成中文是资源获取即初始化。 面试官:RAII有什么特点和优势? 二…

      Related posts:

      1. 台式服务器托管收费
      2. 丰城服务器托管租用批发服务
      3. 软件构建和隐喻
      4. 精选苏州托管机房,保障您的服务器稳定
      5. 江苏UbuntuFTP服务器托管:高效、安全的数据存储与管理

      服务器托管,北京服务器托管,服务器租用,机房机柜带宽租用

      服务器托管

      咨询:董先生

      电话13051898268 QQ/微信93663045!

      上一篇: 如何判断一个点是否在凸多边形内 – golang
      下一篇: 【技术积累】Linux中的基础知识【二】

      最新更新

      • 单文件组件形式
      • TiDB 7.1.0 LTS 特性解读丨关于资源管控 (Resource Control) 应该知道的 6 件事
      • 软件开发流程
      • Fabric 2.x 智能合约开发记录
      • 初窥Huawei_Campus 解决方案_用户接入(三)

      随机推荐

      • 经济实惠的服务器托管服务
      • 解析:现今网站服务器是否普遍托管
      • 企业云计算:利用托管服务器实现高效运营
      • 杭州专业服务器托管租用服务
      • 运营商服务器托管的优势

      客服咨询

      • 董先生
      • 微信/QQ:93663045
      • 电话:13051898268
      • 邮箱:dongli@hhisp.com
      • 地址:北京市石景山区重聚园甲18号2层

      友情链接

      • 服务器托管
      • 机房租用托管
      • 服务器租用托管
      ©2023 服务器托管,北京服务器托管,服务器租用-价格及机房咨询 京ICP备13047091号-8