簡體   English   中英

是一個同步的volatile變量? (Java)的

[英]is a volatile variable synchronized? (java)

假設我有一個私有變量,並且我有一個synchronizedsetVariable()方法,它是否與使用volatile修飾符完全相同?

否。易失性意味着變量不會緩存在任何每線程緩存中,並且在需要時始終從主內存中檢索其值。 同步意味着那些每線程緩存將在某些點保持同步。 理論上,如果許多線程需要讀取變量的值,那么使用volatile變量會帶來很大的速度損失,但它很少被改變。

不,調用synchronized getXXX / setXXX方法與讀/寫volatile變量不同。

多個線程可以同時讀取或寫入volatile變量。 但是,一次只有一個線程可以讀取或寫入由synchronized塊保護的變量。

volatile變量不同步(至少不synchronized東西)。 volatile作用是確保每次使用變量時檢索變量(即:它阻止某些類型的優化),以及IIRC以正確的順序讀取和寫入變量。 這可以想象地模擬某些類型的同步,但如果你的setter必須設置多個東西,它就不能工作。 (例如,如果設置兩個volatile變量,則會有一個設置一個而另一個不設置的點。)

沒有任何關系。

基本上

  • Volatile =>它總是檢索參數的最新值
  • Synchronized =>它同時只提供1個線程

實際上沒有

volatile實際上是較弱的同步形式,當字段被聲明為volatile ,編譯器和運行時理解該variable是共享的,並且對它的操作不應該與其他內存操作重新排序。 易失性變量不會緩存在寄存器或緩存中,而是隱藏在其他處理器中,因此讀取volatile變量始終會返回任何線程的最近寫入。

只是一個例子:

First thread run  :
while(stopped){
 ... do something
}

Second thread run :
stopped = true;

將stop作為一個volatile布爾值聲明為第一個線程具有一個新的值是有用的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM