多線程訪問共享資源的時候,須要注意兩個問題:java
爲了保證以上兩點,須要用鎖,也稱爲互斥量(mutex)。Java提供了關鍵字volatile和synchronized,爲鎖(互斥量)提供了支持。緩存
volatile能夠理解爲輕量級的synchronized,它保證了共享變量的可見性,即一個線程修改共享變量時,其餘線程對這個修改是能夠看見的,是能讀到這個修改值的。volatile不會引發上下文的切換。
volatile的具體實現原理可簡單地描述爲:多線程
若是變量沒有被聲明爲volatile,那麼在上述第2步時,不會立刻寫回內存,這樣會使得其餘線程以爲x仍是有效的。線程
synchronized可用於同步方法和代碼段。code
當同步的是普通方法時,鎖的是當前實例對象。當在這個實例對象上調用了synchronized方法且未釋放鎖時,調用該實例對象上其餘的synchronized方法時會阻塞。對象
public class test{ synchronized void f(){} synchronized void g(){} }