[英]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.