gpt4 book ai didi

java - 为什么这里需要同步?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:36:41 25 4
gpt4 key购买 nike

我正试图填补我的 Java 线程知识中的一些可耻的空白,我正在阅读 Brian Goetz 等人的 Java Concurrency in Practice(强烈推荐 BTW),书中的一个早期示例给我留下了一个问题。在下面的代码中,我完全理解为什么在更新hitscacheHits成员变量时需要同步,但是为什么需要同步getHits仅读取 hits 变量时的方法?

第 2 章中的示例代码:

public class CachedFactorizer extends GenericServlet implements Servlet {
private BigInteger lastNumber;
private BigInteger[] lastFactors;
private long hits;
private long cacheHits;

public synchronized long getHits() {
return hits;
}

public synchronized double getCacheHitRatio() {
return (double) cacheHits / (double) hits;
}

public void service(ServletRequest req, ServletResponse resp) {
BigInteger i = extractFromRequest(req);
BigInteger[] factors = null;
synchronized (this) {
++hits;
if (i.equals(lastNumber)) {
++cacheHits;
factors = lastFactors.clone();
}
}
if (factors == null) {
factors = factor(i);
synchronized (this) {
lastNumber = i;
lastFactors = factors.clone();
}
}
encodeIntoResponse(resp, factors);
}...

我觉得它与原子性、监视器和锁有关,但我并不完全理解这些,所以请那里的人能解释得更深入一点吗?

提前致谢...

詹姆斯

最佳答案

除了线程的非volatile变量的缓存 View 在没有同步时可能会无限期地保持不更新之外:

read/write access to a long or double is NOT guaranteed to be atomic!

从理论上讲,您最终可能会看到一个仅更新前 4 个字节或最后 4 个字节的值。然而,volatile 也解决了这个问题。

关于java - 为什么这里需要同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2418761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com