1. 程式人生 > >Java語言中的執行緒安全

Java語言中的執行緒安全

執行緒安全定義:當多個執行緒訪問一個物件時,如果不用考慮這些執行緒在執行時環境下的排程和交替執行,也不需要考慮進行額外的同步,或者在呼叫方進行任何其他的寫作操作,呼叫這個物件的行為都可以獲得正確的結果,那這個物件時執行緒安全的。

將Java語言中的各種操作共享的資料分為以下五類:

  1. 不可變:一定是執行緒安全的,如用final關鍵字修飾的變數,String物件,列舉型別,部分Number子類,如Double,Long等數值包裝類,BigInteger,BigDecimal等大資料型別
  2. 絕對執行緒安全:對於Java API中標註自己是執行緒安全的類,大多不是絕對的執行緒安全,如Vector,雖然他的add(),get(),remove()方法都是被synchronized修飾的,但是在多執行緒的環境中,如果不在方法中做額外的操作,仍然是不安全的。
  3. 相對執行緒安全:通常意義上的執行緒安全,它需要保證對這個物件單獨的操作是執行緒安全的,我們在呼叫的時候不需要做額外的保障措施,但對於一些特定順序連續呼叫,可能需要在呼叫端使用額外的同步手段來保證呼叫的順序性。如Vector,HashTable
  4. 執行緒相容:指物件本身並不是執行緒安全的,但是可以通過在呼叫端正確地使用同步手段來保證物件在併發環境中可以安全滴使用,如HashMap,ArrayList
  5. 執行緒對立:指無論呼叫段是否採用了同步措施,都無法在多執行緒環境中併發使用的程式碼,如resume(),suspend(),如果兩個執行緒同時持有一個執行緒物件,一個嘗試恢復執行緒,一個嘗試中斷執行緒,如果併發進行的話,無論呼叫時是否進行了同步,目標執行緒都是存在死鎖風險