随手记录线程安全问题
定义:
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
反思: 在spring管理Bean 中,是否会导致线程安全问题的出现,具体代码做一个示例测试看看
服务类代码
@Service
public class TestService {
//全局属性
IdisIdentity idisIdentity = new IdisIdentity();
public IdisIdentity getIdisIdentity() {
return idisIdentity;
}
public void setIdisIdentity(IdisIdentity idisIdentity) {
this.idisIdentity = idisIdentity;
}
public IdisIdentity getMethodN(){
//方法内部属性
IdisIdentity is = new IdisIdentity();
return is;
}
}
获取对象真是内存地址进行检测
注入的bean 属性内存地址获取
System.identityHashCode(testService.getIdisIdentity())
注入的bean 方法内 属性内存地址获取
System.identityHashCode(testService.getMethodN())
//返回结果
//第一次
{
"code": 200,
"success": true,
"data": {
"all": 105265920,
"min": 1130838556
},
"msg": "操作成功"
}
//第N次
{
"code": 200,
"success": true,
"data": {
"all": 105265920,
"min": 105865357
},
"msg": "操作成功"
}
总结:
通过以上代码测试验证,spring 管理的bean 只有还在生命周期内,并不会重新申请内存空间,也就是在高并发多线程下会出现线程安全问题,小白一枚,说错请指正 


