JUC-----線程和程序
就是為了把我認為的幾個好的文章 整理在一起,也就是把連結放在一塊而已,已看友善而已!!!,不喜勿噴 哎 趕緊到頭吧 記概念 太煩人
并發程式設計相關習題Synchronized底層實作
Volatile
并發程式設計相關習題
線程的幾個狀态:
- NEW 建立狀态,線程被建立出來,但尚未啟動時的線程狀态;
- RUNNABLE 就緒狀态,表示可以運作的線程狀态,它可能正在運作,或者是在排隊等待作業系統給它配置設定 CPU 資源;
- BLOCKED 阻塞等待鎖的線程狀态,表示處于阻塞狀态的線程正在等待螢幕鎖,比如等待執行 synchronized 代碼塊或者使用 synchronized 标記的方法;
- WAITING, 等待狀态,一個處于等待狀态的線程正在等待另一個線程執行某個特定的動作,比如,一個線程調用了 Object.wait() 方法,那它就在等待另一個線程調用 Object.notify() 或 Object.notifyAll() 方法;
- TIMED_WAITING, 計時等待狀态,和等待狀态(WAITING)類似,它隻是多了逾時時間,比如調用了有逾時時間設定的方法 Object.wait(long timeout) 和 Thread.join(long timeout) 等這些方法時,它才會進入此狀态;
- TERMINATED 終止狀态,表示線程已經執行完成
public enum State {
/**
* 建立狀态,線程被建立出來,但尚未啟動時的線程狀态
*/
NEW,
/**
* 就緒狀态,表示可以運作的線程狀态,但它在排隊等待來自作業系統的 CPU 資源
*/
RUNNABLE,
/**
* 阻塞等待鎖的線程狀态,表示正在處于阻塞狀态的線程
* 正在等待螢幕鎖,比如等待執行 synchronized 代碼塊或者
* 使用 synchronized 标記的方法
*/
BLOCKED,
/**
* 等待狀态,一個處于等待狀态的線程正在等待另一個線程執行某個特定的動作。
* 例如,一個線程調用了 Object.wait() 它在等待另一個線程調用
* Object.notify() 或 Object.notifyAll()
*/
WAITING,
/**
* 計時等待狀态,和等待狀态 (WAITING) 類似,隻是多了逾時時間,比如
* 調用了有逾時時間設定的方法 Object.wait(long timeout) 和
* Thread.join(long timeout) 就會進入此狀态
*/
TIMED_WAITING,
/**
* 終止狀态,表示線程已經執行完成
*/
}
wait和Sleep的差別
-
來自不同的類
wait===>>Object
sleep===>>>Thread
-
關于鎖的釋放
wait會釋放鎖,sleep睡覺,抱着鎖睡覺,不會釋放鎖
-
使用範圍不同
wait: waite必須在同步代碼塊中
sleep:可以在任何地方睡
-
是否需要鋪獲異常
wait不需要鋪獲異常
sleep必須鋪獲異常
Synchronized底層實作
Synchronized更新的過程
Synchronized 和 Lock 差別
- Synchronized 内置的Java關鍵字, Lock 是一個Java類
- Synchronized 無法判斷擷取鎖的狀态,Lock 可以判斷是否擷取到了鎖
- Synchronized 會自動釋放鎖,lock 必須要手動釋放鎖!如果不釋放鎖,死鎖
- Synchronized 線程 1(獲得鎖,阻塞)、線程2(等待,傻傻的等);Lock鎖就不一定會等待下
- 去;
-
Synchronized 可重入鎖,不可以中斷的,非公平;Lock ,可重入鎖,可以 判斷鎖,非公平(可以
自己設定);
- Synchronized 适合鎖少量的代碼同步問題,Lock 适合鎖大量的同步代碼!
- Synchronized 代碼塊鎖,和方法鎖 Lock是有代碼塊鎖,
- 使用Lock鎖,JVM将花費更少的時間來排程線程,性能更好,并且具有更好的擴充性(提供更多的子類)
Volatile
- 保證了可見性
- 不保證原子性
- 禁止指令重排
synchronized 和 volatile 的差別是什麼?
- synchronized 表示隻有一個線程可以擷取作用對象的鎖,執行代碼,阻塞其他線程。
- volatile 表示變量在 CPU 的寄存器中是不确定的,必須從主存中讀取。保證多線程環境下變量的可見性;禁止指令重排序。
- 差別
- volatile 是變量修飾符;synchronized 可以修飾類、方法、變量。
- volatile 僅能實作變量的修改可見性,不能保證原子性;而 synchronized 則可以保證變量的修改可見性和原子性。
- volatile 不會造成線程的阻塞;synchronized 可能會造成線程的阻塞。
- volatile标記的變量不會被編譯器優化;synchronized标記的變量可以被編譯器優化。
- volatile關鍵字是線程同步的輕量級實作,是以volatile性能肯定比synchronized關鍵字要好。但是volatile關鍵字隻能用于變量而synchronized關鍵字可以修飾方法以及代碼塊。synchronized關鍵字在JavaSE1.6之後進行了主要包括為了減少獲得鎖和釋放鎖帶來的性能消耗而引入的偏向鎖和輕量級鎖以及其它各種優化之後執行效率有了顯著提升,實際開發中使用 synchronized 關鍵字的場景還是更多一些。