Это мой код ..
@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 является потоком в соответствии с Книга Но моя точка зрения ..
1. @ Линия 1 , если 2 потока, поступающие одновременно в этот момент, 1-й thread
проверяет условие и обнаруживает factor = null , а 2-й thread
также проверяют то же самое состояние одновременно после 1-го thread
приостановить в строке 2-й и найти factor = null
И то, и другое будет создавать новый OneValueCached
Object. Тогда, как этот код является потокобезопасным. Согласно книге, это потокобезопасный.
Спасибо в