我有一个试图创建目录的线程调用的函数(如果尚未创建)。但是,当线程尝试并行调用此方法时,将不断抛出FileAlreadyExistsException。将此方法设置为synchronized
可以解决此问题,但是有更好的方法。在多线程环境中已经创建目录的情况下,创建目录或跳过目录的正确方法是什么?
public void createDir(Path path){
if (Files.notExists(path)) {
Files.createDirectory(path);
}
}
最佳答案
根据doc,“检查和创建”功能已经在Files.createDirectory()
中进行了编码,而是原子的(即,它是线程安全的):
因此,您应该只需要删除多余的存在检查即可:
public void createDir(Path path){
Files.createDirectory(path);
}