作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是我的代码..
@immutable // This is not a standard annotation .Only for Showing that behavior of Class
class OneValueCached{
private final BigInteger lastNumber;
private final BigInteger[] lastFactors;
public OneValueCached(BigInteger i,BigInteger[] factors){
lastNumber=i;
lastFactors=Arrays.copyOf(factors, factors.length);
}
public BigInteger[] getFactors(BigInteger i){
if(lastNumber==null || !lastNumber.equals(i))
return null;
else
return Arrays.copyOf(lastFactors, lastFactors.length);
}
}
@threadSafe // This is not a standard annotation .Only for Showing that behavior of Class
public class VolatileCachedFactorizer implements Servlet{
private volatile OneValueCached cache=new OneValueCached(null, null);
public void service(ServletRequest req, ServletResponce resp){
BigInteger i= extractFromRequest(req);
BigInteger[] factors=cache.getFactors(i);
if(factors==null){ // ---> line 1
factors=factor(i); // --> line 2
cache=new OneValueCached(i, factors);
}
encodeIntoResponse(resp,factors);
}
}
根据 Book 为什么类 VolatileCachedFactorizer 是线程但是我的观点是..
<强>1。 @Line 1 如果此时有 2 个线程同时出现,第一个 thread
检查条件并找到 factor=null 和第二个 thread
在第一个 thread
挂起在 2nd 行并发现 factor=null
后,还要同时检查相同的条件并且两者都将创建新的 OneValueCached
对象 然后这段代码如何是线程安全的..根据书这是线程安全的..
谢谢
最佳答案
它是线程安全的,因为 lastNumber
和 lastFactors
之间永远不会不一致,这可能会导致不正确的因式分解。它不保证会发生最少数量的因式分解:OneValueCached
可以多次创建,但这仍然是线程安全的。
关于java - 这段代码如何以及为什么是线程安全的……?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9884645/
我是一名优秀的程序员,十分优秀!