我有一个用于发送电子邮件的方法。我想锁定这个方法,这样每次只有一个线程可以访问它,其余的线程可以同时访问。我应该同步该方法还是使用 spring @transactional PROPAGATION_REQUIRED ?
在我的服务层
//each time use new thread to send out email
public void sendThroughSMTP(List<String> emails,String subject,String content){
//each time will open and sent through port 25. dont u think this will caused too many threads spawned?
BlastEmailThread blastEmailThread = new BlastEmailThread(emails,subject,content);
blastEmailThread.start();
}
最佳答案
为什么不通过不使用任何实例级的东西来使方法线程安全?
但是,我不明白 Spring 的事务管理在这里如何适用。我的意思是 Spring 提供了很少的事务管理器,即 DataSourceTransactionManager、JtaTransactionManager、HibernateTransactionManager 所有这些都是关于数据库持久性的。您将为发送的这封电子邮件配置什么?
我相信,首先您应该向我们展示为什么您首先担心线程安全。您很可能想向我们展示一些相关的代码片段或其他内容。那么我们也许可以向您推荐一些东西。
[附录]
当您为该方法的每次调用生成一个线程并且不使用状态中的任何内容时,那么为什么要使该方法同步
。使方法同步不会以任何方式限制线程数量。由于同步的原因,在启动新线程之前,前一个线程可能已经完成了工作。生成线程的过程可能会变慢。
但是,您应该继续这样做,直到您发现确实有很多线程正在运行并且内存即将耗尽。如果你真的想提前解决这个问题,那么你应该选择一些阻止机制,比如 Semaphore .
关于java - 同步方法还是使用 spring @transactional?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1950596/