[英]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直接鎖。
Client
對象的每個實例創建了新鎖? synchronized
關鍵字是否會強制在應用get / put操作之前更新緩存? synchronized
提供的無論是上靜態變量或一個實例變量中使用的相同的保證不管。 即內存可見性和原子性。 在您的情況下,它在實例級別為屬性cache
提供了線程安全性。
因此,提出您的問題
你是對的。 Client
每個實例將具有其自己的鎖。 但這在多個客戶端之間共享一個Client
實例時很有用。
執行synchronized
塊后,CPU本地緩存將刷新到主內存中,這確保了其他線程的內存可見性。 在開始執行synchronized
塊時,本地CPU緩存將無效並從主存儲器中加載。 因此,是的, synchronized
將導致實例變量cache
具有最新值。 請參閱同步以獲取更多詳細信息。
原因與2.相同,即提供內存可見性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.