1. 程式人生 > >《Java並發編程實戰》第三章 對象的共享 讀書筆記

《Java並發編程實戰》第三章 對象的共享 讀書筆記

簡單的 存儲 簡單 bsp 程序實現 popu 都是 ack reference


一、可見性 什麽是可見性? Java線程安全須要防止某個線程正在使用對象狀態而還有一個線程在同一時候改動該狀態,並且須要確保當一個線程改動了對象的狀態後。其它線程能夠看到發生的狀態變化。 後者就是可見性的描寫敘述即多線程能夠實時獲取其它線程改動後的狀態。 *** 待補充 兩個工人同一時候記錄生產產品總數問題
1. 失效數據 可見性出現故障就是其它線程沒有獲取到改動後的狀態。更直觀的描寫敘述就是其它線程獲取到的數據是失效數據。
2. 非原子64位操作
3. 加鎖與可見性 比如在一個變量的讀取與+1上加入一把鎖,鎖保證了其它線程獲取到此變量都是+1後的值,所以能夠保證可見性。
4. Volatile變量 線程對共享變量的改動。對其它線程可見 滿足下面條件,使用Volatitle:
對變量的寫入操作不依賴變量的當前值。或者你能確保僅僅有單個線程更新變量的值。 該變量不會與其它狀態變量一起納入不變形條件中。 在訪問變量時不須要加鎖。




二、公布 、逸出 公布一個對象的意思是指。使對象可以在當期作用域之外的代碼中使用。 簡單的能夠理解為其它地方獲取到當前類的對象,這樣的情況就是公布當前類。 Java多線程不僅要確保當前類是線程安全的,並且須要保證使用當前類對象的全部地方都要保證線程安全性。

三、封裝 線程封閉 - 把共享的數據,僅在線程中使用,不共享.比如java的ThreadLocal類 Ad-hoc線程封閉 -- 維護線程封閉性的職責全然由程序實現承擔.(非常脆弱) 線程封閉 - 通常將特定子系統實現為一個單線程子系統 棧封閉 線程封閉的特例, 比如基本類型的局部變量 ThreadLocal - 通常防止可變的單實例對象 或 全局變量進行共享.

四、不可變 final對象,本身不可改變,可是final中的變量卻能夠改變

五、安全公布方式: 1. 靜態初始化函數中初始化一個對象引用 2. 將對象的引用保存到volatile類型的域或者AtomicReference對象中 3. 將對象的引用保存到某個正確的構造對象的final類型域中 4. 將對象的引用保存到一個由鎖保護的域中

java並發編程(二): 對象的共享

探索並發編程(三)------Java存儲模型和共享對象

同步和Java內存模型 (三)可見性


《Java並發編程實戰》第三章 對象的共享 讀書筆記