konhon

          忘掉過(guò)去,展望未來(lái)。找回自我,超越自我。
          逃避不一定躲的過(guò), 面對(duì)不一定最難過(guò), 孤單不一定不快樂(lè), 得到不一定能長(zhǎng)久, 失去不一定不再擁有, 可能因?yàn)槟硞€(gè)理由而傷心難過(guò), 但我卻能找個(gè)理由讓自己快樂(lè).

          Google

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            203 Posts :: 0 Stories :: 61 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 2005-08-16 20:23 konhon 優(yōu)華 閱讀(105126) 評(píng)論(32)  編輯  收藏 所屬分類: Java

          Feedback

          # re: synchronized的4種用法 2012-12-19 21:04 迷一樣
          很通俗易懂,學(xué)習(xí)了  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2013-03-30 21:59 candy_code
          通篇都是在扯淡。
          synchronized鎖的永遠(yuǎn)是對(duì)象,而不是代碼塊。synchronized作為方法修飾符時(shí)鎖的對(duì)象是調(diào)用者。不同的對(duì)象仍然訪問(wèn)此方法不會(huì)構(gòu)成同步。
          至于這句:
          public int synMethod(int a1){
          synchronized(a1) {
          //一次只能有一個(gè)線程進(jìn)入
          }
          }
          更是扯淡中的扯淡。 這句話編譯器都不會(huì)讓你通過(guò)。樓主可以自己敲代碼試試。希望樓主不要再發(fā)表這種誤人子弟的言論。  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2013-04-25 20:54 todo
          文中很多點(diǎn)是錯(cuò)的,摟主快傷了吧  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2013-07-13 23:19 圣戰(zhàn)風(fēng)云
          @candy_code
          你說(shuō)的沒(méi)錯(cuò)!  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2013-07-23 00:35 李唐靖
          誤人子弟。搞得我還以為我理解錯(cuò)了。  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2013-07-24 02:31 酷乞丐
          感覺(jué)通篇都講錯(cuò)了。我之所以上網(wǎng)搜,是想知道
          synchronized(this) {
          //access y here
          }
          代表了什么,如果所是鎖對(duì)象,那應(yīng)該是它自身,而它自身本來(lái)就只存在一根線程里啊。又何來(lái)鎖住其它線程的。除非是單例,例如struts1的Action。  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2013-07-29 01:33 whxp
          同意,實(shí)踐證明@candy_code
            回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法[未登錄](méi) 2013-09-23 01:45
          第二種方法用不上,報(bào)錯(cuò),其他還沒(méi)看  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2014-04-02 22:15 gdlbbxzsc
          這個(gè) 按照我的理解的話,應(yīng)該說(shuō)分兩種吧?
          第一種是 對(duì)象鎖 無(wú)論是在 方法前面加 sync 還是 在 代碼塊括號(hào)內(nèi)加,都一樣 鎖住的是 對(duì)象。
          方法 鎖得 是 當(dāng)前類 對(duì)象(方法加static另說(shuō),相當(dāng)于類鎖),一個(gè)類的兩個(gè)對(duì)象調(diào)用同一方法是不會(huì)阻塞的。
          代碼塊 所得 也是對(duì)象,如果是 this的話 跟 方法鎖是一樣的。
          如果是其他對(duì)象。如 string,那么 就是當(dāng)這個(gè)類的創(chuàng)建的 所有對(duì)象 想調(diào)用這個(gè) 代碼塊的時(shí)候,都會(huì)阻塞,因?yàn)镾tring 對(duì)象 被 某一個(gè)類對(duì)象 使用中么。。
          代碼塊還有一種 就是 類鎖,aaa。class 這種 當(dāng)這個(gè)時(shí)候 就相當(dāng)于 static sync
          所有 對(duì)象 都會(huì) 阻塞  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2014-06-16 22:02 laj
          都是從哪復(fù)制到啊,誰(shuí)是第一個(gè)寫(xiě)這篇文章的人  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2014-07-07 04:06 god
          沒(méi)有成員鎖,只有對(duì)象鎖和類對(duì)象鎖  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2014-07-15 09:36 我心飛翔
          @candy_code
          是的,我也覺(jué)得,本來(lái)極簡(jiǎn)的同步,在這里搞的這么復(fù)雜,我們經(jīng)常用的無(wú)非就是2種,一種是鎖對(duì)象的,另一種是鎖代碼塊  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2014-07-28 00:36
          日,誤人子弟啊  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法[未登錄](méi) 2014-07-29 07:49 deepblue
          講解synchronized內(nèi)容的文章,我印象最深刻的是這篇文章,大家也可以去看看,與本文的角度不太一樣的:http://www.strutshome.com/index.php/archives/495  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2014-08-03 22:42 的撒發(fā)生
          @deepblue
          他媽哪都有你  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法[未登錄](méi) 2015-01-07 11:34 bonus
          樓主得罪人了嗎?哪來(lái)這么多帶強(qiáng)烈感情色彩的噴子。即使有小瑕疵,但是對(duì)象鎖和塊鎖的道理還是對(duì)的。synchronized(this/obj)的區(qū)別搞懂了再來(lái)噴吧。感覺(jué)很詭異這樓!  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法[未登錄](méi) 2015-01-07 11:37 bonus
          @candy_code
          沒(méi)編譯錯(cuò)誤,已經(jīng)運(yùn)行,敢問(wèn)錯(cuò)在哪里。意見(jiàn)不同也不能說(shuō)人家扯淡.  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法[未登錄](méi) 2015-01-07 12:06 bonus
          最基本的問(wèn)題,判斷是否需要同步,首先要看這塊資源是否有其它線程共同調(diào)用。那共同調(diào)用這塊如果是代碼塊,就是塊鎖(哪怕是System.out.println)也是鎖你沒(méi)商量,通常出現(xiàn)在多個(gè)線程是通過(guò)同一個(gè)線程類生成的,share代碼;如果共用的不是代碼塊而只是對(duì)象,那鎖的就是對(duì)象。究其根本就是看爭(zhēng)奪的資源是什么。不要孔乙己一樣研究回子的寫(xiě)法死記硬背,強(qiáng)烈建議深入理解其機(jī)制。  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法[未登錄](méi) 2015-01-07 12:27 bonus
          再次重申,有對(duì)象鎖,也有塊鎖。塊鎖是絕對(duì)存在的!如果沒(méi)有塊的概念,下面兩段代碼就沒(méi)什么不同了。但結(jié)果是,第一段代碼的20循環(huán)是同步的,因?yàn)楸粔K保護(hù)。而第二段代碼的20循環(huán)很顯然會(huì)被別的線程打亂。

          第一段:
          synchronized(obj){
          for (int i = 0; i<20; i++) {
          Thread.sleep(100);
          System.out.println(Thread.currentThread.getName());
          }
          obj.method();
          }

          第二段:
          for (int i = 0; i<20; i++) {
          Thread.sleep(100);
          System.out.println(Thread.currentThread.getName());
          }
          synchronized(obj){
          obj.method();
          }  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2015-02-15 02:33 sjj
          @candy_code
          你所說(shuō)的問(wèn)題更大,synchronized是有塊鎖的,且修飾方法時(shí)鎖的絕不是調(diào)用者,而是指調(diào)用該方法時(shí)必須排隊(duì)執(zhí)行。不同的對(duì)象在調(diào)用該方法時(shí)都要排隊(duì)。

          樓主的代碼中,synchronized如果改為修飾對(duì)象就行了
          public int synMethod(Integer a1){
          synchronized(a1) {
          //一次只能有一個(gè)線程進(jìn)入
          }
          }  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2015-02-27 20:03 背黑鍋
          啥玩意啊!synchronized(this)這樣才是一次只有一個(gè)線程進(jìn)入  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2015-03-30 21:50 游客
          private void show(int threadNo) {
          synchronized(threadNo){
          for (int i = 0; i < 10; i++) {
          System.out.println("內(nèi)d"+threadNo+i);
          }
          }

          }


          int is not a valid type's argument for the synchronized statement  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2015-06-29 01:54 jileniao.net
          表示還沒(méi)能理解。  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法[未登錄](méi) 2015-07-23 21:33 aaa
          @candy_code
          我還以為是我理解錯(cuò)誤了啊,誤人子弟  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2015-12-18 03:40 mart
          我覺(jué)得也是 扯淡 呀  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2016-01-25 02:33 個(gè)廣告
          建議直接刪掉帖子,  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2016-01-29 07:04
          怪不得enjoy losing face!  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2016-03-01 04:02 王小凱
          樓主SB,誤人子弟,別再編程了  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法[未登錄](méi) 2016-03-21 07:26 df
          樓主坑爹,趕緊回去買(mǎi)本書(shū)補(bǔ)習(xí)  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法[未登錄](méi) 2016-04-13 01:27 java
          誤人子弟的典范,垃圾中的戰(zhàn)斗機(jī)  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2016-07-26 21:08 路人
          @java
          就算樓主錯(cuò)了也不該這么說(shuō)人家吧,這樣子,以后還有誰(shuí)敢分享自己的見(jiàn)解了,說(shuō)的對(duì)了沒(méi)有贊賞,說(shuō)錯(cuò)了被一大堆人噴。。。。  回復(fù)  更多評(píng)論
            

          # re: synchronized的4種用法 2016-08-10 04:13 a-little-love
          @路人
          就是就是!  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 尉犁县| 邢台市| 云安县| 武乡县| 衡山县| 贡觉县| 大宁县| 汾西县| 富阳市| 龙胜| 科尔| 海南省| 永城市| 新民市| 石嘴山市| 兴海县| 仙桃市| 石城县| 永靖县| 石渠县| 鸡西市| 舟曲县| 喀喇沁旗| 大英县| 宜良县| 吉木乃县| 望江县| 广汉市| 浪卡子县| 同江市| 长岛县| 禹州市| 清新县| 昭平县| 监利县| 宿松县| 宽城| 中山市| 锡林浩特市| 中宁县| 丰都县|