簡體   English   中英

synced關鍵字如何作用於實例變量?

[英]How does the synchronized keyword work on an instance variable?

我正在看一些形式的舊代碼

public class Client {
  private final Cache cache; 
  .....
   Client( final Cache cache) {
    this.cache = cache;
   }

  public Value get(Key key) {
     synchronized(cache){
       return this.cache.get(key);
     }
    }
   public void put(Key k , Value v) {
        synchronized(this.cache){
            return cache.put(k, v);
        }
    }
   }
}

我從未見過可以被修改為鎖對象的實例變量,因為通常鎖通常是最終的Object實例,或者只是通過Java API直接鎖。

  1. 在這種情況下,同步關鍵字如何產生作用? 是否為Client對象的每個實例創建了新鎖?
  2. 使用synchronized關鍵字是否會強制在應用get / put操作之前更新緩存?
  3. 為什么在獲取之前必須進行同步? 假設另一個線程應用了臨時放置,是否要使緩存更新為最新值。

synchronized提供的無論是上靜態變量或一個實例變量中使用的相同的保證不管。 即內存可見性和原子性。 在您的情況下,它在實例級別為屬性cache提供了線程安全性。

因此,提出您的問題

  1. 你是對的。 Client每個實例將具有其自己的鎖。 但這在多個客戶端之間共享一個Client實例時很有用。

  2. 執行synchronized塊后,CPU本地緩存將刷新到主內存中,這確保了其他線程的內存可見性。 在開始執行synchronized塊時,本地CPU緩存將無效並從主存儲器中加載。 因此,是的, synchronized將導致實例變量cache具有最新值。 請參閱同步以獲取更多詳細信息。

  3. 原因與2.相同,即提供內存可見性。

暫無
暫無

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

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