基本上,若是一個域可能被多個任務同時訪問,而且這些任務中至少有一個是寫入任務,那麼就應該將這個域設置爲volatile的。若是你將一個域定義爲volatile的,那麼它就會告訴編譯器不要執行任何移除讀取和寫入操做的優化,這些操做的目的是用線程中的局部變量維護對這個域的精確同步。針對volatile關鍵字修飾的域,讀取和寫入都是直接針對內存的,並無被緩存。可是,volatile並不能對遞增進行原子操做。緩存
若是須要原子性的更新操做,可使用AtomicInteger,AtomicLong等特殊的原子性變量類。只有在特殊狀況下會用到這種類庫,經常使用的就是計數了。一般使用鎖會更安全一些,要麼是synchronized,要麼是Lock對象安全
針對防止多線程同時訪問方法內部的部分代碼而不是整個方法時會用到同步塊。這種分離的方式被稱爲臨界區。使用synchronized鎖住一個對象,此對象的鎖用來對花括號內的代碼進行同步控制。多線程
synchronized(syncObject){性能
//synchronized code優化
}spa
在進入同步塊代碼以前必須得到同步對象的鎖,不然須要在等待鎖釋放以後得到鎖才能夠進入同步塊代碼。線程
使用同步塊的好處是,可使多我的問訪問對象的時間性能獲得顯著提升。code
//TODO demo對象