//无状态的Servlet
@ThreadSafe
public class statelessFactorizer implements Servlet{
public void service(ServletRequest request,ServletResponse response){
BigInteger i = extractFromRequest(request);
BigInteger[] factors = factor(i);
encodeIntoResponse(request,response);
}
}
计算过程的临时状态仅存在于线程栈上的局部变量中,并且只能由正在执行的线程访问,一个线程不会影响另外一个线程,没有共享状态,所以无状态对象是线程安全的
Tips: 无状态对象一定是线程安全的
//非线程安全
@NotThreadSafe
public class UnsafeCountingFactorizer implements Servlet{
private long count = 0;
public long getCount(){
return count;
}
public void service(ServletRequest request,ServletResponse response){
BigInteger i = extractFromRequest(req);
BigInteger[] factors = factor(i);
++count;
encodeIntoResponse(resp,factors);
}
}
++count是一种紧凑的语法,使其看上去只是一个操作,其实是一个复合操作,包括,读取->修改->写入的操作序列,并且其结果状态依赖于之前的状态
多个线程去操作,会出现漏加,递增失效,在并发编程中,由于不恰当的执行时序而出现不正确的结果是一种非常重要的情况,它有一个正式的名字:竞态条件