差異處

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

連向這個比對檢視

Both sides previous revision 前次修改
下次修改 Both sides next revision
java:effective_java:concurrency:synchronize_access_to_shared_mutable_data [2020/02/17 23:32]
tony
java:effective_java:concurrency:synchronize_access_to_shared_mutable_data [2020/02/17 23:52]
tony [Introduction]
行 8: 行 8:
 再來必須了解的是處理方法,最簡單的是直接使用synchronized去做mutual exclusion: 再來必須了解的是處理方法,最簡單的是直接使用synchronized去做mutual exclusion:
 <code bash> <code bash>
-synchronized(mutext_object) { +synchronized(mutex_object) { 
-    // operations on the mutext_object+    // operations on the mutex_object
 } }
 </​code>​ </​code>​
 +synchronized可以保證上面提到的三個特性,但最大的缺點就是無法被interrupted;如果可以的話,建議使用Lock相關的API。\\
 +\\
 +另外常被誤用的就是volatile。volatile可以確保可見性與有序性,但它無法保證原子性,如果在多執行緒的存取下,一樣有可能造成不正確的結果。\\
 +\\
 +最後一個要提的就是java.util.concurrent.atomic內的Atomic類。它是透過volatile加CAS(Compare and set)來達到thread-safe與lock-free的特性,因此往往能獲得比較好的效能:​
 +<code java>
 +// Lock-free synchronization with java.util.concurrent.atomic
 +private static final Atomiclong nextSerialNum = new Atomiclong();​
 +public static long generateSerialNumber() {
 +    return nextSerialNum.getAndIncrement();​
 +}
 +</​code>​
 +
 +
  
 ===== Note ===== ===== Note =====