繁体   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