讀《JAVA併發實踐》筆記 第三章(共享物件)

2021-08-01 21:48:47 字數 1590 閱讀 6914

共享物件:

可見性:

當對乙個變數的讀寫操作在不同執行緒實現的時候,不能保證讀執行緒及時的讀取其他執行緒寫入的值。為了確保跨域執行緒寫入記憶體的可見性,必須使用同步機制。

測試demo:

「` public class novisibilitytest catch (interruptedexception e)

break;

}// system.out.println("**********==value的值 : ***************=");}}

}class value implements runnable catch (interruptedexception e)

change = true;

system.out.println("**********==value的值 : " + ischange() + "***************=");

}public boolean ischange()

public void setchange(boolean change)

}「` 過期資料:

當讀執行緒去獲取變數時,它有可能獲取乙個過期。除非每一次訪問變數的方法都是同步的。

最低安全性:

執行緒在沒有同步的情況下讀取變數,可能會獲得乙個過期值,但是事某個執行緒設定的乙個真是數值。這叫最低安全性。

最低安全性適用於所有變數,除了沒有宣告為volatile的64位變數(double和long)。

鎖和可見性:

當a和b用相同的鎖監視同步**塊時,a在同步**塊之中或之前做的每件事,對b都是可見的。如果沒有同步就沒有這樣的保證。

例圖:

鎖不僅僅是關於同步與互斥的,也是關於記憶體可見性的。為了保證所有執行緒都能看到共享的,可變變數的最新值,讀和寫執行緒都必須使用公共的鎖進行同步。

volatile變數:

弱形式的同步。當乙個域被宣告為volatile型別後,編譯器和執行時會監視這個變數:它是共享的,而且對它的操作不會與其他記憶體操作一起被重排序。volatile變數不會快取在暫存器或者快取在其他處理器隱藏的地方。所以,讀乙個volatile變數,總是會返回某一線程所寫入的最新值。

加鎖可以保證可見性和原子性;volatile只能保證可見性。

正確使用volatile變數的方式包括:用於確保它們所引用的物件的狀態的可見性,或者用於標識重要的生命週期事件(如初始化或關閉)的發生。

只有滿足下面所有標準後,才能使用volatile變數:

1.寫入變數時並不依賴變數當前值;或者確保只有單一執行緒修改變數的值。

2.變數不需要與其他狀態變數共同參與不變約束。

3.訪問變數時,沒有其他原因需要加鎖

執行緒封閉:

訪問共享的,可變的資料要求同步。乙個避免同步的方法就是不共享資料。(本地變數和threadlocal類)

不可變變數:

它的狀態不能在建立後再被修改。

所有的域都是final型別。

它被正確建立(建立時沒有發生this引用的溢位)。

第三章實踐報告

1.實踐題目 7 1 數字三角形 30 分 給定乙個由 n行數字組成的數字三角形如下圖所示。試設計乙個演算法,計算出從三角形 的頂至底的一條路徑 每一步可沿左斜線向下或右斜線向下 使該路徑經過的數字總和最大。2.問題描述 輸入有n 1行 第 1 行是數字三角形的行數 n,1 n 100。接下來 n行...

第三章筆記

第三章預習筆記 一 高階語言和機器指令中的運算 1,按位運算 符號 按位or運算 符號 按位and運算 符號 表示按位not運算 符號 按位xor運算。實現掩碼操作 通過與給定的乙個位模式進行按位與,可以提取所需要的位,對這些位進行 置1 清0 等。2,符號 按位or運算 符號 表示and運算 符號...

C 實踐 第三章 函式

問題描述 編寫具有如下原型的函式 bool f long x 其功能為 若整數 x 僅由偶數字 0 2 4 6 8 組成時 如 x 26480 函式返回 true,否則返回 false 如當 x 22034 時 並編制主函式對它進行呼叫。輸入形式 只能是乙個整數數字,中間不能有空格等其他字元 輸出形...