spring boot 定义这个私有成员变量,每次请求从controller访问指定的方法
在方法中对成员变量进行赋值操作,随后后续执行都只读改变量,多个请求会对这个成员变量产生安全问题么?
继续补充一波代码演示下
控制器
@RestController
@RequestMapping("/code")
public class AController {
@Autowired
private AService aService;
@RequestMapping("/search")
public Result<T> search(T dto) throws Exception {
return this.aService.search(dto);
}
}
服务
@Service
@Slf4j
public class CServiceImpl extends ServiceImpl implements CService {
private Group group = null;
@Autowired
private GroupService groupService;
public Result search(T dto) {
// 每次都从数据库取一条数据覆盖该group成员变量
this.group = this.groupService.getOne(dto.getId());
// 继续执行下面的逻辑,以下操作都仅限于读取group的值,不会修改,在多个请求并发时,this.group会不会发生线程安全问题呢?
this.todo1(this.group);
this.todo2(this.group);
this.todo3(this.group);
}
}
默认情况下,控制器为单例,如果 Service是自动装配的,默认情况下,服务也为单例。所以操作要处理成线程安全的才行。至于你说的先赋值,再读取,要看是不是一次性赋值,还是每次都赋值。
很多线程序安全也是也初始化实现成线程不安全的,但初始后的正常运行是线程安全的。具体可能还是要看你的使用场景和代码了。
如果你只在 search 方法里用于了 group,那赋值给成员变量是完全多余的操作,可以直接去掉了。
如果还有少量别的方法也用,以传参的方式实现会更简单。