在理解什么是线程安全性,讲到一个实例:
一个无状态的Servlet
@ThreadSafe
public class StatelessFactorizer implements Servlet{
public void service (ServletRequest req, ServletResponse resp){
BigInteger i = extractFromRequest(req);
BigInteger[] factors=factors(i);
encodeIntoResponse(resp,factors);
}
}
与大多数Servlet一样,StatelessFactorizer 是无状态的:既不包含任何域,也不包含任何对其他类中域的引用。
servlet如果定义了一个static类型的成员变量--有状态的servlet
任何你处理的时候如果要改这个字段并进行处理,可能你第一次请求改了这个字段 之后处理之前 这个字段就被第二个并发请求给改了--线程不安全
如果你一个成员变量都没有 就不会有这个问题--无状态的servlet
无状态对象一定是线程安全的。
在线程安全类中封装了必要的同步机制,因此客户端无须进一步采取同步机制。
当多个线程访问某一个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确行为,那么这个类是线程安全的。