JAVA 線程安全

JAVA 線程安全

線程安全定義

一個類在可以被多個線程安全調用時就是線程安全的。

線程安全分類

線程安全不是一個非真即假的命題,可以將共享數據按照安全程度的強弱順序分成以下五類:不可變、絕對線程安全、相對線程安全、線程兼容和線程對立。

1. 不可變

不可變(Immutable)的對象一定是線程安全的,無論是對象的方法實現還是方法的調用者,都不需要再採取任何的線程安全保障措施,只要一個不可變的對象被正確地構建出來,那其外部的可見狀態永遠也不會改變,永遠也不會看到它在多個線程之中處於不一致的狀態。

不可變的類型:

  • final 關鍵字修飾的基本數據類型;
  • String
  • 枚舉類型
  • Number 部分子類,如 Long 和 Double 等數值包裝類型,BigInteger 和 BigDecimal 等大數據類型。但同為 Number 的子類型的原子類 AtomicInteger 和 AtomicLong 則並非不可變的。

2. 絕對線程安全

不管運行時環境如何,調用者都不需要任何額外的同步措施。

3. 相對線程安全

相對的線程安全需要保證對這個對象單獨的操作是線程安全的,在調用的時候不需要做額外的保障措施,但是對於一些特定順序的連續調用,就可能需要在調用端使用額外的同步手段來保證調用的正確性。

4. 線程兼容

線程兼容是指對象本身並不是線程安全的,但是可以通過在調用端正確地使用同步手段來保證對象在併發環境中可以安全地使用,我們平常說一個類不是線程安全的,絕大多數時候指的是這一種情況。Java API 中大部分的類都是屬於線程兼容的,如與前面的 Vector 和 HashTable 相對應的集合類 ArrayList 和 HashMap 等。

5. 線程對立

線程對立是指無論調用端是否採取了同步措施,都無法在多線程環境中併發使用的代碼。由於 Java 語言天生就具備多線程特性,線程對立這種排斥多線程的代碼是很少出現的,而且通常都是有害的,應當儘量避免。

更多內容請關注每日編程,每天進步一點。


分享到:


相關文章: