什么是线程安全
- 例1
public class Counter {
private int num = 10;
public int getNum() {
return num++;
}
}
例1就是典型的非线程安全的对象,当多个线程访问Counter对象的getNum方法时,在特殊的时序下,如果两个线程同时读取到num的值,则两个线程可能返回的结果都为11。
我们通常会说一个类也就是一个对象是线程安全的,可以看出,线程安全针对的是对象,即线程中该对象实例调用方法是否为线程安全。
编写的代码线程安全的核心是管理共享的,可变的变量,线程是可以共享统一进程下的资源的,如果共享资源的访问不能得到控制,多个线程在访问时改变了资源的状态,可能就得不到预期的结果
无状态对象与有状态对象
在线程安全中,无状态对象(statelss bean)是一个十分重要的概念,是指不能保存和修改数据,直接由线程访问。与之对应的是有状态对象(state bean),java中POJO对象就是典型的有状态对象。