二十四 java 多線程一些知識點

1:blocked線程和waiting的線程的區別? 如何喚醒?java

   java線程中含有waiting與blocked兩種狀態:編程

   線程的 blocked狀態每每是沒法進入同步方法/代碼塊來完成的(BLOCKED是指線程正在等待獲取鎖)。這是由於沒法獲取到與同步方法/代碼塊相關聯的鎖。多線程

  WAITING是指線程正在等待其餘線程發來的通知(notify),收到通知後,可能會順序向後執行(RUNNABLE),也可能會再次獲取鎖,進而被阻塞住(BLOCKED)。(有幾種狀況致使WAITING狀態呢?: 本身call  join(),  wait(), 或等待其餘線程call  notify(), notifyall())框架

  notify是將某個waiting的線程狀態改變爲blocked(因爲notify的線程還沒有退出臨界區,還沒有釋放鎖,因此被喚醒的線程狀態變爲blocked),notifyAll是將全部線程的狀態改變爲blocked。spa

        JAVA爲提供了wait()和notifyAll以及notify()實現掛起線程,而且喚醒另一個等待的線程。(這些方法只能在一個同步語句或者同步方法內調用,緣由是由於若是一個方法不要求互斥,那麼就沒有必要在線程間監聽或者是合做,每一個線程均可以自由訪問這個方法。)操作系統

  在JAVA虛擬機中,每一個對象(Object和class)經過某種邏輯關聯監視器,爲了實現監視器的互斥功能,每一個對象(Object和class)都關聯着一個鎖(有時也叫「互斥量」),這個鎖在操做系統書籍中稱爲「信號量」,互斥(「mutex 「)是一個二進制的信號量。線程

  咱們知道JAVA每一個對象(Object/class) 都關聯一個監視器,更好的說法應該是每一個對象(Object/class)都有一個監視器,對象能夠有它本身的臨界區,而且可以監視線程序列爲了使線程協做,JAVA爲提供了wait()和notifyAll以及notify()實現掛起線程,而且喚醒另一個等待的線程。對象

  在java虛擬機中,每一個對象和類在邏輯上都和一個監聽器相關聯。爲了實現監聽器的共同執行能力,鎖(有時候又叫互斥量)關聯着每一個對象和類,在操做系統書上被稱之爲「信號量」,互斥量其實就是一個二態的信號量。繼承

3: 原子類和synchronized 哪一個快?接口

      就算沒有競爭,synchronized也比原子操做慢。

  Synchronized鎖是獨佔的,意味着若是有別的線程在執行,當前線程只能是等待!

  比較並交換(compare and swap, CAS),是原子操做的一種,可用於在多線程編程中實現不被打斷的數據交換操做,從而避免多線程同時改寫某一數據時因爲執行順序不肯定性以及中斷的不可預知性產生的數據不一致問題。 該操做經過將內存中的值與指定數據進行比較,當數值同樣時將內存中的數據替換爲新的值。

  它將內存位置的內容與給定值進行比較,只有在相同的狀況下,將該內存位置的內容修改成新的給定值。 這是做爲單個原子操做完成的。 原子性保證新值基於最新信息計算; 若是該值在同一時間被另外一個線程更新,則寫入將失敗。 操做結果必須說明是否進行替換; 這能夠經過一個簡單的布爾響應(這個變體一般稱爲比較和設置),或經過返回從內存位置讀取的值來完成(摘自維基本科)

CAS包含3個參數:

  V表示要更新的變量

  E表示預期值

  N表示新值

       若是V值等於E值,則將V的值設爲N。若V值和E值不一樣,則說明已經有其餘線程作了更新,則當前線程什麼都不作。通俗的理解就是CAS操做須要咱們提供一個指望值,當指望值與當前線程的變量值相同時,說明還沒線程修改該值,當前線程能夠進行修改,也就是執行CAS操做,但若是指望值與當前線程不符,則說明該值已被其餘線程修改,此時不執行更新操做,但能夠選擇從新讀取該變量再嘗試再次修改該變量,也能夠放棄操做,原

4 java  lock底層實現

5 多線程包

7 lock synchronized 

8 同步方法 VS 同步代碼塊:

  java中,每個對象都有一把鎖,線程用synchronized獲取對象上的鎖。

  非靜態同步方法:鎖是類的對象的鎖

  靜態同步方法:鎖的是類自己

  同步方法塊:鎖是能夠選擇的。因此能更加精確的控制。粒度更細緻,能夠更精確的控制對象鎖。

9 確保N個線程能夠訪問N個資源而不死鎖?

  指定資源獲取順序。全部線程都按照一樣的順序請求資源。

10 建立線程的方法:

  繼承Thread

  實現Runnable接口:這種方式更受歡迎,由於能夠繼承其餘的類。

  Executor框架建立線程池

11 線程的幾種可用狀態:

  new:剛建立的線程,可是沒有調用start。

  就緒(Runnable):調用start, run()方法就執行,可是不必定立刻執行。等待時間片。

  運行(Running) :獲得CPU能夠執行,正在執行。

  阻塞(waitting):正在運行到線程,暫時讓出CPU。各類緣由能夠致使阻塞:

              sleep():調用一個在I/O上被阻塞的操做,即該操做在輸入/輸出完成前不會返回到調用者。

              等待鎖。

  死亡:run() 方法正常退出,天然死亡。未捕獲到異常終止了run方法而使線程猝死。

相關文章
相關標籤/搜索