JAVA學習筆記——併發(二)

共享受限資源

多線程訪問共享資源的時候,須要注意兩個問題:java

  1. 多個線程不能同時訪問一個資源
  2. 多個線程順序訪問一個資源時,須要保持操做的原子性

爲了保證以上兩點,須要用鎖,也稱爲互斥量(mutex)。Java提供了關鍵字volatile和synchronized,爲鎖(互斥量)提供了支持。緩存

volatile

volatile能夠理解爲輕量級的synchronized,它保證了共享變量的可見性,即一個線程修改共享變量時,其餘線程對這個修改是能夠看見的,是能讀到這個修改值的。volatile不會引發上下文的切換。
volatile的具體實現原理可簡單地描述爲:多線程

  1. 線程A準備修改共享變量x,A將x從內存讀入CPU緩存進行修改。
  2. 當修改結束後,將x寫回內存。這時其餘線程發現了它們原本保存的變量x無效了(經過緩存一致性協議實現),就會從內存從新讀取。

若是變量沒有被聲明爲volatile,那麼在上述第2步時,不會立刻寫回內存,這樣會使得其餘線程以爲x仍是有效的。線程

synchronized

synchronized可用於同步方法和代碼段。code

同步普通方法

當同步的是普通方法時,鎖的是當前實例對象。當在這個實例對象上調用了synchronized方法且未釋放鎖時,調用該實例對象上其餘的synchronized方法時會阻塞。對象

public class test{
    synchronized void f(){}
    synchronized void g(){}
}

同步靜態方法

同步代碼段

相關文章
相關標籤/搜索