synced关键字如何作用于实例变量?

时间:2019-03-07 00:09:20

标签: java multithreading synchronization locking

我正在查看一些格式为

的旧代码
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. 为什么在获取之前必须进行同步?假设另一个线程应用了临时放置,是否可以将缓存更新为最新值?

1 个答案:

答案 0 :(得分:0)

ContentModel.PROP_NODE_UUID提供相同的保证,而不管它是用于静态变量还是实例变量。即内存可见性和原子性。就您而言,它在实例级别为属性NodeService提供了线程安全性。

所以,提出您的问题

  1. 您是对的。 synchronized的每个实例将具有其自己的锁。但这在多个客户端之间共享cache的实例时很有用。

  2. 在执行Client块之后,CPU本地缓存将刷新到主内存中,这确保了其他线程的内存可见性。在Client块开始执行时,本地CPU缓存将无效并从主存储器中加载。因此,是的,synchronized将导致实例变量synchronized具有最新值。有关更多详细信息,请参见Synchronization

  3. 原因与2相同。即,提供内存可见性。