是的,这是线程安全的,只要它被声明为原型范围bean,并且您需要创建一个由Spring调用的init()方法:
@PostConstruct
public void init() {
listOfItem = context.getListOfItem();
}
RequestContext只能从单个线程(分配用于处理请求的线程)访问,构造函数不会因为在调用之前创建对象而具有可重入性.
注意不要将它与listOfItem混淆以防止重入问题,只是因为它被锁定在MyMapper对象中并不会阻止它被getter共享(如果有的话)(在你的情况下不存在) ).我也看到它是一个抽象类,但由于listOfItem是私有的,所以子类不能访问它.该列表的任何泄漏引用都可以由并发线程操纵,因为它是由引用构成的任何副本(因为列表在Java中是可变的).
由于这是您的意图,因此创建一个单元测试来检查字段的可见性,如果通过反射访问字段则不会引发相应的异常.您可能还希望使用自己的内部标记注释对该字段进行注释,以指示该字段是线程安全的.这有助于文档和注释,潜在的未来自动化(例如可以查找所有此类注释并自动运行反射测试的测试基础).
看起来很干净!保持良好的工作.
线程安全与Spring Bean
本文探讨了在Spring框架中如何确保Bean的线程安全性,特别是在原型范围内的Bean。通过实例说明了如何正确地初始化Bean,并讨论了在多线程环境中避免重入问题的方法。
10万+

被折叠的 条评论
为什么被折叠?



