1、线程安全
指多个线程访问某个类时,不管运行时环境采用何种调度方式或线程将如何交替执行
,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为
,称这个类时线程安全的
2、线程安全核心
主要是对状态访问进行管理 ,尤其是共享的和可变的状态访问
注:
- 对象的状态是存储在状态变量(实例或静态域中)的数据,换句话说,就是类中 的各种变量,包括静态和非静态变量
- 无状态对象一定是线程安全的,如下图所示,没有状态变量,如代码1
@ThreadSafe
public class StatelessFactorizer extends GenericServlet implements Servlet {
public void service(ServletRequest req, ServletResponse resp) {
BigInteger i = extractFromRequest(req);
BigInteger[] factors = factor(i);
encodeIntoResponse(resp, factors);
}
void encodeIntoResponse(ServletResponse resp, BigInteger[] factors) {
}
BigInteger extractFromRequest(ServletRequest req) {
return new BigInteger("7");
}
BigInteger[] factor(BigInteger i) {
// Doesn't really factor
return new BigInteger[] { i };
}
}
3、竞态条件
当某个计算取决于多个线程的交替执行时,就会发生竞态条件----本质是基于一种可能失效的观察结果来做出判断或者执行某个计算,例如延迟初始化,如代码2,这里是依据instace的值来做判断
@NotThreadSafe
public class LazyInitRace {
private ExpensiveObject instance = null;
public ExpensiveObject getInstance() {
if (instance == null)
instance = new ExpensiveObject();
return instance;
}
}
网友评论