共享物件:
可見性:
當對乙個變數的讀寫操作在不同執行緒實現的時候,不能保證讀執行緒及時的讀取其他執行緒寫入的值。為了確保跨域執行緒寫入記憶體的可見性,必須使用同步機制。
測試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 時 並編制主函式對它進行呼叫。輸入形式 只能是乙個整數數字,中間不能有空格等其他字元 輸出形...