<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)航:
     
    主站蜘蛛池模板: 亚洲AV成人无码网天堂| 福利免费在线观看| 中文字幕一精品亚洲无线一区 | 国产一区二区三区免费观在线| 亚洲Av无码专区国产乱码DVD| 久久99九九国产免费看小说| 黄人成a动漫片免费网站| 亚洲AV天天做在线观看| 四虎影视大全免费入口| 性无码免费一区二区三区在线| 亚洲av无码专区国产不乱码| 久久精品亚洲日本佐佐木明希| 日韩一区二区免费视频| 免费看又黄又无码的网站| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲中文字幕AV在天堂| 亚洲日韩中文在线精品第一| 1000部拍拍拍18勿入免费凤凰福利 | 亚洲码在线中文在线观看| 亚洲A∨精品一区二区三区| 114级毛片免费观看| a一级毛片免费高清在线| 亚洲日韩精品无码专区| 亚洲卡一卡2卡三卡4卡无卡三| 免费a级毛片无码av| 久久精品无码一区二区三区免费| 在线看片免费人成视频播| 免费一区二区三区在线视频 | 国产免费拔擦拔擦8X高清在线人| 亚洲AV成人无码久久WWW| 亚洲国产综合精品| 国产成A人亚洲精V品无码性色| 国产精品冒白浆免费视频| 免费在线观看h片| 无码av免费网站| 国产成人免费ā片在线观看老同学| 国产精品亚洲专区无码WEB| 亚洲精品第一国产综合野| 久久99亚洲网美利坚合众国| 亚洲乱码无码永久不卡在线| 亚洲日韩在线观看|