線程安全
Brian Goetz在《Java Concurrency In Practice》中提出線程安全的定義:當多個線程訪問一個對象的時候,如果不用考慮這些線程在運行時環境下的調度和交替執行,也不需要進額外的同步,或者在調用方法進行任何其他的協調操作,調用這個對象的行爲都可以獲得正確結果,那麼這個對象就是線程安全的。
1/1 Java語言中的線程安全
我們可以將Java語言中各種操作共享的數據分爲以下5類:不可變、絕對線程安全、相對線程安全、線程兼容和線程對立。
- 不可變:在JDK1.5以後,不可變的對象一定是線程安全的。
- 絕對線程安全:完全滿足Brian Goetz提出的線程安全的定義就是絕對線程安全。Java API中標註自己是線程安全的類大多數都不是絕對的線程安全,比如Vector。
- 相對線程安全:相對線程安全就是我們通常意義上所講的線程安全,它需要保證這個對象單獨的操作是線程安全的,我們調用的時候不需要額外的安全措施,但是對於特定順序的連續調用,就可能需要在調用端額外的同步手段來保證調用的正確性。
- 線程兼容:線程兼容是指對象本身並不是線程安全的,但是可以通過在調用端正確的使用同步手段來保證對象在併發環境中可以安全的使用,我們說一個類不是線程安全的,絕大多數是這種情況。
- 線程對立:線程對立是無論是否採取了同步措施,都無法在多線程環境中併發使用的代碼。這個在Java語言中幾乎不存在。
1/2 線程安全的實現方法
- **互斥同步: **