<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 3, 文章 - 152, 評論 - 17, 引用 - 0
    數(shù)據(jù)加載中……

    對Java同步一些理解

    對Java同步一些理解
    kingfish 2005
    ------------------------------------------------------------
    基本概念:
      每個Object都會有1個鎖.
      同步就是串行使用一些資源.

    (說明:以下有些例子為了突出重點,省略了不必要的代碼.特別是省掉了一些成員變量,就是需要同步的對象.)

    1. 多線程中對共享、可變的數(shù)據(jù)進行同步.
       對于函數(shù)中的局部變量沒必要進行同步.
       對于不可變數(shù)據(jù),也沒必要進行同步.

       多線程中訪問共享可變數(shù)據(jù)才有必要.


    2. 單個線程中可以使用synchronized,而且可以嵌套,但無意義.
       class Test {
         public static void main(String[] args) {
             Test t = new Test();
             synchronized(t) {
               synchronized(t) {
                  System.out.println("ok!");
               }
             }
         }
       }
      
    3. 對象實例的鎖
       class Test{
         public synchronized void f1(){
             //do something here
         }

         public void f2(){
            synchronized(this){
               //do something here
             }
         }
       }
     
       上面的f1()和f2()效果一致, synchronized取得的鎖都是Test某個實列(this)的鎖.
       比如: Test t = new Test();
             線程A調(diào)用t.f2()時, 線程B無法進入t.f1(),直到t.f2()結束.

       作用: 多線程中訪問Test的同一個實例的同步方法時會進行同步.

    4. class的鎖
       class Test{
           final static Object o= new Object();

           public static synchronized void f1(){
              //do something here
           }
     
           public static void f2(){
             synchronized(Test.class){
               //do something here
             }
           }
      
          public static void f3(){
            try {
              synchronized (Class.forName("Test")) {
              //do something here
              }
            }
            catch (ClassNotFoundException ex) {
            }
          }
         
           public static void g(){
              synchronized(o){
                //do something here
              }
           }
       }

       上面f1(),f2(),f3(),g()效果一致
       f1(),f2(),f3()中synchronized取得的鎖都是Test.class的鎖.
      
       g()是自己產(chǎn)生一個對象o,利用o的鎖做同步
       作用: 多線程中訪問此類或此類任一個實例的同步方法時都會同步. singleton模式lazily initializing屬于此類.

    5. static method
       class Test{
          private static int v = 0;

          public static void f1(){
            //do something, 但函數(shù)中沒用用到v
          }

          public synchronized static void f2(){
            //do something, 函數(shù)中對v進行了讀/寫.
          }  
       }

       多線程中使用Test的某個實列時,
        (1) f1()是線程安全的,不需要同步
        (2) f2()這個靜態(tài)方法中使用了函數(shù)外靜態(tài)變量,所以需要同步.

    6.  對線程的run()進行同步?jīng)]有意義,如 public synchronized void run()
        class Test extends Thread{
          public synchronized void run(){
            while(true){
               //do something
            }
          }
         
          public synchronized void f(){
             //...
          }
        }
        這種例子會有一個問題, 執(zhí)行run()時(內(nèi)部在循環(huán)), 外部無法執(zhí)行f()


        class Test extends Thread{
           public synchronized void run(){
             //do something
           }
        }
        這種例子同步基本沒用, 因為run()通常靠 new Test().start()來執(zhí)行的.
        因為Test實例不同,鎖也不同.

    posted on 2005-02-27 17:37 閱讀(231) 評論(0)  編輯  收藏 所屬分類: J2se

    主站蜘蛛池模板: 亚洲AV无码一区二区三区在线观看 | 91麻豆国产自产在线观看亚洲| 亚洲精品9999久久久久无码| 免费观看成人毛片a片2008| 亚洲av无码不卡久久| 日韩吃奶摸下AA片免费观看| 亚洲国产成人精品激情| 最近免费中文字幕4| 亚洲大码熟女在线观看| 日韩免费视频在线观看| 粉色视频成年免费人15次| 免费在线观看视频a| 两个人看的www免费视频| 久久精品国产亚洲AV网站| 69精品免费视频| 四虎亚洲精品高清在线观看| 国产精品久久免费视频| 丁香六月婷婷精品免费观看| 亚洲成A∨人片在线观看不卡| 少妇人妻偷人精品免费视频| 亚洲中文字幕久在线| 免费无码黄动漫在线观看| 四虎国产精品永免费| 亚洲AV电影院在线观看| 18国产精品白浆在线观看免费 | 天天摸夜夜摸成人免费视频 | 2022年亚洲午夜一区二区福利| 免费观看激色视频网站bd| 亚洲暴爽av人人爽日日碰| 一级毛片直播亚洲| 在线看片免费人成视频播| 亚洲国产日韩在线| 亚洲精品乱码久久久久久不卡| 免费的全黄一级录像带| 亚洲午夜一区二区三区| 亚洲精品tv久久久久| 十九岁在线观看免费完整版电影| 亚洲中文字幕一区精品自拍| 亚洲一区二区三区在线播放| 亚洲精品在线免费看| 一级毛片a免费播放王色电影 |