當多個線程訪問一個對象時,若是不用考慮這些線程在運行時環境下的調度和交替執行,也不須要考慮額外的同步,或者在調用方進行任何其餘協調操做,調用這個對象的行爲均可以得到正確的結果,這個對象就是線程安全的。安全
無論運行時環境如何,調用者都不須要任何額外的同步措施。bash
Java API標註是線程安全的通常都不是絕對線程安全。多線程
Vector,HashTable ,Collections的SynchronizedCollection()方法併發
對象自己不是線程安全的,可是能夠經過調用端正確地使用同步手段,能夠保證在併發環境下安全的使用。ArrayList等優化
不管是否使用同步手段,多線程環境下都不可以使用。spa
System.setIn(),System.setOut()線程
互斥是方法,同步是目的。3d
synchronized關鍵字,編譯後會生產moniterenter和moniterexit兩個指令碼。code
ReentrantLockcdn
優先使用synchronized
CAS操做 sun.misc.Unsafe類的compareAndSwapInt(),compareAndSwapLong()
有ABA問題,能夠用時間戳,version
可重入代碼(冪等): 輸入一樣的數據,返回的結果都相同。
線程本地存儲(只有一個線程使用)
一段代碼的數據不與其餘共享
自旋鎖 「讓等待鎖的線程稍等一下」,執行一個忙循環,默認執行10次。
經過參數-XX:PreBlockSpin來更改。
自適應自旋鎖:自旋時間不固定,由上一次在同一個鎖上的自旋等待時間及鎖的持有者狀態來肯定。
依託逃逸分析的數據支持,例如線程私有的部分會去掉同步鎖。
public void a(){
while(i>0){
synchronized{// 每次循環都加鎖,好煩系統資源。
do something();
i++
}
}
}
//JVM自動優化爲:
public void a(){
synchronized{// 粗化僅僅加一次鎖
while(i>0){
do something();
i++
}
}
}
複製代碼
消除無數據競爭狀況下的同步原語。
這個鎖會偏向第一個獲取它的線程。該鎖沒有被其餘線程獲取,持有偏向鎖的線程不須要進行同步。
基於Mark Word的CMS進行。
2個以上線程競爭同一個鎖,會膨脹爲重量級鎖。
更多詳情頁,請訪問: juntech.top