JAVA中線程同步方法

來源:互聯網
上載者:User

在這裡看到的:http://lanvis.blog.163.com/blog/static/26982162009798422547/

1 wait方法:
  該方法屬於Object的方法,wait方法的作用是使得當前調用wait方法所在部分(代碼塊)的線程停止執行,並釋放當前獲得的調用wait所在的代碼塊的鎖,並在其他線程調用notify或者notifyAll方法時恢複到競爭鎖狀態(一旦獲得鎖就恢複執行)。
  調用wait方法需要注意幾點:
  第一點:wait被調用的時候必須在擁有鎖(即synchronized修飾的)的代碼塊中。
  第二點:恢複執行後,從wait的下一條語句開始執行,因而wait方法總是應當在while迴圈中調用,以免出現恢複執行後繼續執行的條件不滿足卻繼續執行的情況。
  第三點:若wait方法參數中帶時間,則除了notify和notifyAll被調用能啟用處於wait狀態(等待狀態)的線程進入鎖競爭外,在其他線程中interrupt它或者參數時間到了之後,該線程也將被啟用到競爭狀態。
  第四點:wait方法被調用的線程必須獲得之前執行到wait時釋放掉的鎖重新獲得才能夠恢複執行。

2 notify方法和notifyAll方法:
  notify方法通知調用了wait方法,但是尚未啟用的一個線程進入線程調度隊列(即進入鎖競爭),注意不是立即執行。並且具體是哪一個線程不能保證。另外一點就是被喚醒的這個線程一定是在等待wait所釋放的鎖。
  notifyAll方法則喚醒所有調用了wait方法,尚未啟用的進程進入競爭隊列。

3 synchronized關鍵字:
  第一點:synchronized用來標識一個普通方法時,表示一個線程要執行該方法,必須取得該方法所在的對象的鎖。
  第二點:synchronized用來標識一個靜態方法時,表示一個線程要執行該方法,必須獲得該方法所在的類的類鎖。
  第三點:synchronized修飾一個代碼塊。類似這樣:synchronized(obj) { //code.... }。表示一個線程要執行該代碼塊,必須獲得obj的鎖。這樣做的目的是減小鎖的粒度,保證當不同塊所需的鎖不衝突時不用對整個對象加鎖。利用零長度的byte數組對象做obj非常經濟。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.