差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
下次修改 Both sides next revision
java:effective_java:concurrency:synchronize_access_to_shared_mutable_data [2020/02/17 01:03]
tony [Introduction]
java:effective_java:concurrency:synchronize_access_to_shared_mutable_data [2020/02/17 23:32]
tony
行 2: 行 2:
 ====== Effective Java - Synchronize access to shared mutable data ====== ====== Effective Java - Synchronize access to shared mutable data ======
 ===== Introduction ===== ===== Introduction =====
-這個Item主要在宣導「針對多執行緒會共享的變數,應該要Synchronize access;為了提高效能而不使用它,是非常危險且錯誤的。」要能寫出正確且效能好的程式碼,首先必須要了解原子性、有序性、可見性這三個特性,再使用正確的武器+這個Item主要在宣導「針對多執行緒會共享的變數,應該要Synchronize access;為了提高效能而不使用它,是非常危險且錯誤的。」要能寫出正確且效能好的程式碼,首先必須要了解原子性、有序性、可見性這三個特性:​ 
-  * 原子性: 對於共享變數的連續操作,必須確保全部都會被執行且不會被打斷。+  * 原子性: 對於共享變數的連續操作,必須確保全部都會被執行且不會被打斷。如果做到一半被打斷,結果當然就不會正確
   * 可見性: 某一執行緒對共享變數做了修改,另外一個變數在使用時,能夠立即拿到最新的數值。由於每個執行緒都有一份變數的資料備份,如果其中一個執行緒對變數做修改,當沒有做到可見性就會導致其它執行緒拿到舊的值。   * 可見性: 某一執行緒對共享變數做了修改,另外一個變數在使用時,能夠立即拿到最新的數值。由於每個執行緒都有一份變數的資料備份,如果其中一個執行緒對變數做修改,當沒有做到可見性就會導致其它執行緒拿到舊的值。
   * 有序性: 程式的執行結果必須和程式碼順序的執行結果相同。沒辦法確保有序性,是由於CPU為了提高程式的執行效率,做了代碼重排,在多執行緒時會有機會發生問題。   * 有序性: 程式的執行結果必須和程式碼順序的執行結果相同。沒辦法確保有序性,是由於CPU為了提高程式的執行效率,做了代碼重排,在多執行緒時會有機會發生問題。
 +再來必須了解的是處理方法,最簡單的是直接使用synchronized去做mutual exclusion:
 +<code bash>
 +synchronized(mutext_object) {
 +    // operations on the mutext_object
 +}
 +</​code>​
  
 ===== Note ===== ===== Note =====