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

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

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

    demibug

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      24 Posts :: 3 Stories :: 2 Comments :: 0 Trackbacks

        1.方法聲明時(shí)使用,放在范圍操作符(public等)之后,返回類型聲明(void等)之前.這時(shí),線程獲得的是成員鎖,即一次只能有一個(gè)線程進(jìn)入該方法,其他線程要想在此時(shí)調(diào)用該方法,只能排隊(duì)等候,當(dāng)前線程(就是在synchronized方法內(nèi)部的線程)執(zhí)行完該方法后,別的線程才能進(jìn)入.
     
          例如:

          public synchronized void synMethod() {
            //方法體
          }

        2.對(duì)某一代碼塊使用,synchronized后跟括號(hào),括號(hào)里是變量,這樣,一次只有一個(gè)線程進(jìn)入該代碼塊.此時(shí),線程獲得的是成員鎖.例如:

          public int synMethod(int a1){
            synchronized(a1) {
              //一次只能有一個(gè)線程進(jìn)入
            }

          }


        3.synchronized后面括號(hào)里是一對(duì)象,此時(shí),線程獲得的是對(duì)象鎖.例如:

     

     public class MyThread implements Runnable {
        public static void main(String args[]) {
        MyThread mt = new MyThread();
        Thread t1 = new Thread(mt, "t1");
        Thread t2 = new Thread(mt, "t2");
        Thread t3 = new Thread(mt, "t3");
        Thread t4 = new Thread(mt, "t4");
        Thread t5 = new Thread(mt, "t5");
        Thread t6 = new Thread(mt, "t6");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();
        t6.start();
      }


      public void run() {
        synchronized (this{
          System.out.println(Thread.currentThread().getName());
        }

      }

    }
     
     

     
        對(duì)于3,如果線程進(jìn)入,則得到當(dāng)前對(duì)象鎖,那么別的線程在該類所有對(duì)象上的任何操作都不能進(jìn)行.在對(duì)象級(jí)使用鎖通常是一種比較粗糙的方法。為什么要將整個(gè)對(duì)象都上鎖,而不允許其他線程短暫地使用對(duì)象中其他同步方法來(lái)訪問(wèn)共享資源?如果一個(gè)對(duì)象擁有多個(gè)資源,就不需要只為了讓一個(gè)線程使用其中一部分資源,就將所有線程都鎖在外面。由于每個(gè)對(duì)象都有鎖,可以如下所示使用虛擬對(duì)象來(lái)上鎖:

     

     class FineGrainLock {

       MyMemberClass x, y;
       Object xlock = new Object(), ylock = new Object();

       public void foo() {
          synchronized(xlock) {
             //access x here
          }


          //do something here - but don't use shared resources

          synchronized(ylock) {
             //access y here
          }

       }


       public void bar() {
          synchronized(this{
             //access both x and y here
          }

          //do something here - but don't use shared resources
       }

      }



         4.synchronized后面括號(hào)里是類,此時(shí),線程獲得的是對(duì)象鎖.例如:

     

    class ArrayWithLockOrder{
      private static long num_locks = 0;
      private long lock_order;
      private int[] arr;

      public ArrayWithLockOrder(int[] a)
      {
        arr = a;
        synchronized(ArrayWithLockOrder.class{//-----這里
          num_locks++;             // 鎖數(shù)加 1。

          lock_order = num_locks;  // 為此對(duì)象實(shí)例設(shè)置唯一的 lock_order。
        }

      }

      public long lockOrder()
      {
        return lock_order;
      }

      public int[] array()
      {
        return arr;
      }

      }


      
    class SomeClass implements Runnable
     
    {
      public int sumArrays(ArrayWithLockOrder a1,
                           ArrayWithLockOrder a2)
      {
        int value = 0;
        ArrayWithLockOrder first = a1;       // 保留數(shù)組引用的一個(gè)
        ArrayWithLockOrder last = a2;        // 本地副本。
        int size = a1.array().length;
        if (size == a2.array().length)
        {
          if (a1.lockOrder() > a2.lockOrder())  // 確定并設(shè)置對(duì)象的鎖定
          {                                     // 順序。
            first = a2;
            last = a1;
          }

          synchronized(first) {              // 按正確的順序鎖定對(duì)象。
            synchronized(last) {
              int[] arr1 = a1.array();
              int[] arr2 = a2.array();
              for (int i=0; i<size; i++)
                value += arr1[i] + arr2[i];
            }

          }

        }

        return value;

      }

      public void run() {
        //
      }

      }


      
        對(duì)于4,如果線程進(jìn)入,則線程在該類中所有操作不能進(jìn)行,包括靜態(tài)變量和靜態(tài)方法,實(shí)際上,對(duì)于含有靜態(tài)方法和靜態(tài)變量的代碼塊的同步,我們通常用4來(lái)加鎖.

    posted on 2012-11-29 16:46 Hiji 閱讀(120) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲欧美自偷自拍另类视| 国产免费MV大全视频网站| 国产免费观看青青草原网站| 青青久久精品国产免费看| 亚洲AV无码第一区二区三区| 色窝窝免费一区二区三区| 成人久久久观看免费毛片| 亚洲电影免费观看| 免费一区二区三区四区五区| 91麻豆国产免费观看| 国产亚洲成在线播放va| 精品亚洲成AV人在线观看| 国产一区二区三区免费在线观看| 日本免费一区二区久久人人澡| 亚洲精品无码专区| 亚洲成在人天堂在线| 亚洲XX00视频| 一个人免费观看视频www| a级毛片高清免费视频就| MM1313亚洲精品无码久久| 亚洲黄色在线网站| 最新国产AV无码专区亚洲| 日韩一级在线播放免费观看| 国产va在线观看免费| 免费精品久久久久久中文字幕| 亚洲乱码一二三四区麻豆| 国产亚洲人成A在线V网站 | 久久久久久精品免费看SSS| 免费视频成人国产精品网站| 亚洲国产中文在线视频| 亚洲熟妇av一区二区三区漫画| 在线看片人成视频免费无遮挡| 国产精品区免费视频| 一级**爱片免费视频| 亚洲狠狠色丁香婷婷综合| 亚洲精品中文字幕乱码影院| 国产亚洲福利精品一区| 伊在人亚洲香蕉精品区麻豆| 免费看片免费播放| 男人的好看免费观看在线视频| 8888四色奇米在线观看免费看|