同步方法还是使用spring @transactional?

com*_*tta 2 java spring synchronized

我有一个方法将用于发送电子邮件.我想锁定这个方法,所以每次只有一个线程可以接受它,并且其余的池同时存在.我应该同步方法还是使用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();


}
Run Code Online (Sandbox Code Playgroud)

Ade*_*ari 7

为什么不通过不使用任何实例级别的东西使方法线程安全?

但是,我没有看到Spring的事务管理如何适合这里.我的意思是Spring提供几个事务管理器,即DataSourceTransactionManager,JtaTransactionManager,HibernateTransactionManager这一切都是关于数据库的持久性.您将为此电子邮件发送什么配置?

我相信,首先你应该告诉我们为什么你首先担心线程安全.很可能您想向我们展示一些相关的代码片段或其他内容.然后我们可能会建议你一些事情.

[附录]

当您为每个对该方法的调用生成一个线程而不使用该状态中的任何内容时,那么为什么要创建该方法synchronized.使方法同步不会以任何方式限制线程数.在启动新线程之前,由于同步,前一个线程可能已经完成了工作.产生线程的过程可能会变慢.

但是,你应该使用它,直到你发现有很多线程正在运行并且你的内存不足.如果你真的想在时间之前解决这个问题,那么你应该选择一些阻塞机制,比如Semaphore.