【发布时间】:2012-03-27 06:51:44
【问题描述】:
这是我的代码..
@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);
}
}
为什么类 VolatileCachedFactorizer 根据 Book 是线程但我的意思是..
1。 @ 第 1 行 如果 2 个线程同时出现在第 1 个 thread 检查条件并发现 factor=null 和第 2 个 thread 在第 1 个之后同时检查相同的条件thread 在第 2nd 行挂起,发现 factor=null
两者都将创建新的OneValueCached 对象然后这段代码是线程安全的.. 根据书这是线程安全的..
谢谢
【问题讨论】:
-
@threadSafe是什么注解?它要么是拼写错误,要么不是标准注释,因为标准命名约定是@ThreadSafe。 (@immutable也一样) -
请注意,我知道这不是标准注释...
-
return lastFactors=Arrays.copyOf(lastFactors, lastFactors.length);看起来很奇怪。它可能会制作内部数组的防御性副本,但随后也会将内部状态重新分配给它分发的同一个副本。这不再是防御性的或一成不变的。实际上,这是一个编译错误,因为lastFactors是最终的,不是吗? -
你能包含编译的代码吗?你在哪里定义了
cached? -
cached可能是cache。但是factor方法呢?
标签: java multithreading thread-safety