在Java(Spring)中使用线程Id避免争用条件?

在Java(Spring)中使用线程Id避免争用条件?,java,multithreading,concurrency,race-condition,Java,Multithreading,Concurrency,Race Condition,我有一个SpringBootWeb应用程序。其中一个服务具有生成CSV文件并将其保存到磁盘的方法。然后,此方法将文件位置传递给另一个方法,该方法通过电子邮件发送CSV文件,然后将其从磁盘中删除。为了避免并发问题,我决定将线程Id添加到文件名中,如下所示: @Service public class ReportService { @Autowired private ReportRepository serviceRepository; public List<

我有一个SpringBootWeb应用程序。其中一个服务具有生成CSV文件并将其保存到磁盘的方法。然后,此方法将文件位置传递给另一个方法,该方法通过电子邮件发送CSV文件,然后将其从磁盘中删除。为了避免并发问题,我决定将线程Id添加到文件名中,如下所示:

@Service
public class ReportService {

    @Autowired
    private ReportRepository serviceRepository;

    public List<item> generateReport(Timestamp minTime, Timestamp maxTime) {
        // some code to retrieve items list.
        String reportTitle = "report-" + Long.toString(Thread.currentThread().getId()) + ".csv";
        CsvFileWriter report = new CsvFileWriter(reportTitle);
        File file = report.writeCsvFile(data);
        File[] attachments = { file };
        sendReportViaEmail("Please find monthly report attached.", attachments);
        return items;
    }

    private void sendReportViaEmail(String body, File[] attachments) {
        // This method sends CSV via email and then delete the 'attachments' from disk.
    }

}
到目前为止,它似乎正在发挥作用。我想知道的是,在我的情况下,这是否是避免比赛条件的好方法。更具体地说

如果存在使用此服务对api资源的并发请求,每个请求是否由具有唯一线程ID的单独线程处理? sendReportViaEmail是否始终与调用generateReport的线程在同一线程内调用?
您所做的将起作用,因为线程的ID在JVM中是唯一的

按照注释中的建议使用CurrentToMilis不是一个好主意,因为这不能保证是唯一的。两个线程可能同时调用它并获得完全相同的值

如果您想使用内置的工具来实现这一点,请查看。但是请注意,Oracle 1.7中的实现至少依赖于随机数,如果两个线程同时访问它并获得相同的随机数,则该方法将抛出IOException

另一个方法将在同一个线程中调用,如果您调用它…那么,从线程调用。

感谢createTempFile资源。即使在sendReportViaEmail中,我也没有显式调用任何线程。谢谢您的确认。Long.toString已过时。只需使用report-+Thread.currentThread.getId+.csv即可