天天看點

《深入了解java虛拟機》七-線程安全與鎖優化

一、線程安全

當多個線程通路一個對象時,如果不用考慮這些線程在運作時環境下的排程和交替執行,也不需要進行額外的同步,或者在調用方進行任何其他的協調操作,調用這個對象的行為都可以獲得正确的結果,那這個對象就是線程安全的。

1.java語言中線程安全

(1)不可變

在Java語言中,不可變的對象一定是線程安全的,無論是對象的方法實作還是對象的調用者,都不需要再采取任何的線程安全保障措施。

(2)絕對線程安全

絕對的線程安全需要滿足上述的線程安全定義。

(3)相對線程安全

相對的線程安全就是我們通常意義上所講的線程安全,它需要保證對這個對象單獨的操作時線程安全的,我們在調用的時候不需要做額外的保障措施,但是對于一些特定順序的連續調用,就可能需要在調用端使用額外的同步手段來保證調用的正确性。

(4)線程相容

線程相容是指對象本身并不是線程安全的,但是可以通過在調用端正确的使用同步手段來保證對象在并發環境中可以安全地使用,我們平常說的一個類不是線程安全的,絕大多數時候指的是這一種情況。

(5)線程對立

線程對立是指無論調用端是否采取了同步措施,都無法在多線程環境中并發的使用的代碼。

2. 線程安全的實作方法

(1)互斥同步

同步是指多個線程并發通路共享資料時,保證共享資料在同一時刻隻被一個線程使用。

在java中,最基本的互斥同步手段就是synchronized關鍵字,除了synchronized外,還可以使用ReentrantLock來實作同步。

(2)非阻塞同步

互斥同步最主要的問題就是進行線程阻塞和喚醒所帶來的性能問題,是以這種同步也稱阻塞同步。

(3)無同步方案

同步隻是保證共享資料争用時的正确性的手段,如果一個方法本身就不涉及共享資料,那它自然就無須任何同步措施去保證正确性。

a. 可重入代碼

b.線程本地存儲

繼續閱讀