SpringBean中处理线程安全性的java方法及其优缺点
我们正在我的web应用程序(Jetty)中使用邮件服务。服务对象在运行时使用SpringBean注入
现在,该服务不是线程安全的。我们怎么处理?通过阅读这里的一些帖子,我发现了以下选项。请让我们知道利弊;下面的缺点
- 邮件服务内部的同步方法(在web应用程序环境下会很好吗?)李>
- 每次都要创建新对象——由于初始化和发布需要时间,这也会很昂贵
- 对象池
- ThreadLocal-每个线程一个服务对象
Spring配置:
<bean id="mailService" class="com.....MailService">
<property name="mailSender" ref="mailSender" />
<property name="registrationEmailMessage" ref="registrationEmail" />
...
</bean>
爪哇豆
@Autowired
MailService mailService;
# 1 楼答案
同步邮件服务中的方法
通过阻塞进行同步会降低应用程序的速度,这取决于同步块的执行时间。如果它是
singleton
bean,那么对MailService
的调用将按顺序执行。即使它是一个prototype
bean,它仍然可以从不同的线程同时调用,并将导致顺序执行每次都创建新对象。如果不消耗大量时间和资源,这是一个很好的解决方案。在方法中创建新对象作为局部变量,它们将不会在线程之间共享
ThreadLocal。强大的概念,但也有自己的问题:
考虑到可能造成的危害,我们应该尽可能避免使用ThreadLocal李>
对象池。我支持这个解决方案。在本例中,线程安全可以通过编写一个新的线程安全优化silgleton包装bean来实现,在本例中,它将包含
MailService
对象池。包装器可以从任何线程安全地访问,并将执行重定向到池Here就是一个例子