我正在查看一些格式为
的旧代码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操作之前更新缓存?答案 0 :(得分:0)
ContentModel.PROP_NODE_UUID
提供相同的保证,而不管它是用于静态变量还是实例变量。即内存可见性和原子性。就您而言,它在实例级别为属性NodeService
提供了线程安全性。
所以,提出您的问题
您是对的。 synchronized
的每个实例将具有其自己的锁。但这在多个客户端之间共享cache
的实例时很有用。
在执行Client
块之后,CPU本地缓存将刷新到主内存中,这确保了其他线程的内存可见性。在Client
块开始执行时,本地CPU缓存将无效并从主存储器中加载。因此,是的,synchronized
将导致实例变量synchronized
具有最新值。有关更多详细信息,请参见Synchronization。
原因与2相同。即,提供内存可见性。