線程安全鎖優化

線程安全:

當多個線程訪問一個對象時,若是不用考慮這些線程在運行時環境下的調度和交替執行,也不須要考慮額外的同步,或者在調用方進行任何其餘協調操做,調用這個對象的行爲均可以得到正確的結果,這個對象就是線程安全的。安全

Java語言中的線程安全

1.不可變 final Integer類

2.絕對線程安全

無論運行時環境如何,調用者都不須要任何額外的同步措施。bash

Java API標註是線程安全的通常都不是絕對線程安全。多線程

3.相對線程安全(一般意義上的 線程安全)

Vector,HashTable ,Collections的SynchronizedCollection()方法併發

4.線程兼容

對象自己不是線程安全的,可是能夠經過調用端正確地使用同步手段,能夠保證在併發環境下安全的使用。ArrayList等優化

5.線程對立

不管是否使用同步手段,多線程環境下都不可以使用。spa

System.setIn(),System.setOut()線程

線程安全的實現方法

1.互斥同步(阻塞同步,悲觀鎖)

互斥是方法,同步是目的。3d

synchronized關鍵字,編譯後會生產moniterenter和moniterexit兩個指令碼。code

ReentrantLockcdn

優先使用synchronized

2.非阻塞同步(樂觀鎖)

CAS操做 sun.misc.Unsafe類的compareAndSwapInt(),compareAndSwapLong()

有ABA問題,能夠用時間戳,version

3.無同步方案

可重入代碼(冪等): 輸入一樣的數據,返回的結果都相同。

線程本地存儲(只有一個線程使用)

一段代碼的數據不與其餘共享

鎖優化

自旋鎖與自適應自旋

自旋鎖 「讓等待鎖的線程稍等一下」,執行一個忙循環,默認執行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個以上線程競爭同一個鎖,會膨脹爲重量級鎖。

偏向鎖、輕量鎖狀態轉化及對象Mark Word的關係

更多詳情頁

更多詳情頁,請訪問: juntech.top

相關文章
相關標籤/搜索