我们可以考虑下一个代码是线程安全的吗?特别是storage.get(word)方法可以返回一些缓存值吗? 或者在线程中只能缓存对象引用,但是对象状态是非缓存的?我尝试搜索一些java规范,但这没有成功。 TY。
private HashMap<String, Integer> storage = new HashMap<>();
public synchronized void addWord(String word) {
Integer integer = storage.get(word);
if (integer == null) {
storage.put(word, 1);
} else {
storage.put(word, integer + 1);
}
logger.info(storage);
}
答案 0 :(得分:0)
您需要同步或其他方法来确保其他节点的可见性。 当您在监视器内执行关键部分时,确保两件事
1. Atomicity :一次一个线程能够执行关键部分,以避免竞争条件。
2. 可见性:释放锁定强制刷新线程使用的工作内存中的所有写入,并获取锁定强制(重新)加载可访问字段的值。
答案 1 :(得分:-1)
好的,正确答案: JSR-133: 但是,除了相互排斥之外,还有更多的同步。同步确保线程在同步块之前或期间的内存写入以可预测的方式显示给在同一监视器上同步的其他线程。在我们退出synchronized块之后,我们释放了监视器,它具有将缓存刷新到主内存的效果,因此该线程所做的写操作对其他线程是可见的。在我们进入同步块之前,我们获取监视器,它具有使本地处理器高速缓存无效的效果,以便从主存储器重新加载变量。然后,我们将能够看到前一版本中显示的所有写入。
所有