无状态对象与线程安全
过去我们总是在研究线程安全,各种手段保证线程安全,然而在工作一段时间之后,发现了解无状态对象就了解了线程安全的一半
无状态对象就是在一个类里面没有实例变量,或者所有实例变量都是单例的,那么这个对象在线程数据共享下也不会导致数据脏乱,那么就不会导致数据共享问题,从而保证了线程的安全
举个例子:无状态对象
public class A{
@Autowire
//spring默认采用单例模式,所以这里的对象永远只有一份且不可修改,不存在数据共享导致数据脏乱
private B b;
//数据不可修改不可修改,不存在数据共享导致数据脏乱
private static final String aa = “无状态”;
//voliate保证了flag的可见性,因为是boolean,不能进行复合操作(如“++”)一旦修改其他线程也会立马更新,保证了数据共享安全
private voliate boolean flag = true
private void method(){
//每个方法的执行都是在线程里面的一个栈帧的进栈和出栈,局部变量定义在栈上,不存在线程共享问题
int a;
}
有状态对象
public class C{
//任何线程都会创建各自对象,存在数据共享导致数据脏乱
private B b;
private int aa = “有状态”;
//voliate保证了flag的可见性,进行复合操作(如“++”),会导致线程安全问题
private voliate int flag = true
}