使用@Async注释时的线程安全性

时间:2018-09-19 14:07:47

标签: java multithreading spring-boot asynchronous thread-safety

我正在 spring-boot 应用程序中使用Java @async批注来处理和上传excel文件。即使我几乎同时执行多个文件上传,它也可以正常工作。但是,我想知道我实现的以下代码是否是线程安全的。我的理解是,事实并非如此,它可能会失败。我无法重现并发问题

我的代码:

while (rowIterator.hasNext()) {  
    Row row=rowIterator.next();

    if(row.getRowNum()==0) 
        continue;

    BatchScript script=new BatchScript();                       
    String rtId=row.getCell(0).toString();
    String query=row.getCell(1).toString();
    String agent=row.getCell(2).toString();
    script.setRtId(rtId);
    script.setQuery(query);
    script.setAgentName(agent);
}

在代码BatchScript中是我的POJO类。您能否让我知道它是否会失败?

2 个答案:

答案 0 :(得分:1)

如果Rows集合被多个线程共享,则可能存在ConcurrentModificationException。当线程使您的“行”列表发生变化时,情况就是如此。如果不是这样,则您的代码中没有共享的可变性,因此我们可以说它是线程安全的。

答案 1 :(得分:0)

由于创建的对象位于方法调用中,因此它是一个本地对象,并且所有本地对象都是线程安全的。

希望这会有所帮助!