《JAVA併發編程實踐》第二章 線程安全性

1.多線程環境爲什麼會出現問題?

   由於競態條件的存在。     
   競態條件:基於一種可能失效的觀察結果來做出判斷或執行某個計算     
   競態條件分兩種:
                 - **先檢查後執行**
                 - **讀取-修改-寫入**     
   場景:
             單例模式-懶加載
             計數器
    競態條件本身也可以看做是一種複合操作,這個複合操作必須要以原子性來執行。
    說到原子性不得不提原子類,是以Atomic開頭的一組類,定義了一些原子操作的方法

2.如何避免這種失效數據問題?

 不在線程內共享該狀態變量
     日常項目中對象的非靜態實例域都是該線程獨享的。除非是在代碼中開啓一個新線程,纔會有共享的情況發生
將狀態變量修改爲不可變的變量
訪問時使用同步

3.什麼是線程安全性?

當多個線程訪問某個類時,這個類始終表現出正常的行爲
無狀態對象一定是線程安全的
爲什麼?
因爲無狀態的對象沒有實例域,也不包含對其他類中域的訪問,計算過程中的臨時狀態都僅存在於線程棧上的局部變量中
實際的項目中,對象是有狀態的,是由本身的實例域和其他對象的引用組成。
-第四章 對象的組合

4同步-加鎖

synchronized 對象的內部鎖,互斥鎖 鎖的是對象,實例,也能實現同一個線程的重入
由於synchronized可以用在代碼塊,方法上,用在方法上或導致不良併發(可同時調用的數量,不僅受到可用處理資源的限制,還受到程序結構本身的限制)
解決方案:控制synchronized的範圍,

5 爲什麼要用鎖保護?

鎖保護 : 對於可能被多個線程同時訪問的可變狀態變量,訪問它時都需要持有同一個鎖,在這種情況下,我們稱狀態變量是由這個鎖保護的。

假設對於該狀態變量 只有寫操作時是同步的,讀操作沒有使用,那麼某個線程讀取到該狀態變量,並使用的過程中,其他的線程正在修改這個狀態變量
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章