併發概念基礎:線程安全與線程間通信

線程安全

按照線程安全的安全程度來分的話,java中的各種操作共享的數據主要分爲5類:不可變、絕對線程安全、相對線程安全、線程兼容和線程對立。

  • 不可變
    對於final關鍵字可見性來說,只要一個不可變對象被正確構建出來(沒有this引用逃逸),那其外部的可見狀態永遠也不會改變。
    在java api中複覈不可變要求的類型主要有:
    • String
    • 枚舉類型
    • Long和Double等數值包裝類型
    • BigInteger和BigDecimal等大數據類型
      但同在number包下的AtomicLong和AtomInteger等原子類並非是不可變的類型。
  • 絕對線程安全
    java中幾乎沒有
  • 相對線程安全
    這個就是我們通常意義所說的線程安全。
    它需要保證對這個對象單獨的操作時線程安全的,我們在調用的時候不需要做額外的保障措施。但是對於一些特定順序的連續調用,就可能需要在調用端使用額外的同步手段來保證調用的正確性。
    如vector,hashtable等線程安全類都是屬於這種的。
  • 線程兼容
    線程兼容是指對象本身並不是線程安全的,但是可以通過在調用端正確使用同步手段來保證對象在併發環境中可以安全使用。
    java中的ArrayList和HashMap就是這種。
  • 線程對立
    指無論調用端是否採用同步措施,都無法在多線程環境中併發使用代碼。
    一個例子就是Thread類的suspen方法和resume方法,如果有兩個線程同時持有一個線程對象,一個去中斷線程,一個去恢復線程,如果併發進行的話,無論調用是否採用了同步,都會存在鎖死的風險。
    常見的線程對立例子還有:
    System.setIn()
    System.setOut()
    System.runFinalizersOnExit()

線程安全的實現方法

參考併發等級

線程間通信

https://www.cnblogs.com/yangdagaoge/articles/9685023.html

volatile和synchronized
wait/notify 機制
管道輸入/輸出流
Thread.join()
ThreadLocal的使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章