【发布时间】:2018-01-12 10:19:01
【问题描述】:
我想检查该文件是否存在于多线程环境的服务器上,如果存在则直接返回该文件内容或从我的 s3 服务服务器下载。
我的代码是这样的:
final Object lock = new Object();
File file = new File("/file/path");
if (file.exists()) {
return FileUtils.readFileToByteArray(file);
} else {
byte[] bytes = this.downloadFileFromRemoteServer();
if (!file.exists()) {
synchronized (lock) {
if(!file.exists()) {
FileUtils.writeByteArrayToFile(tempFile, bytes);
}
}
}
tempFile.renameTo(file);
return bytes;
}
上面的代码类似java双重检查锁定,方法file.exists()的行为是不是类似volatile关键字?和伪代码正确吗?
【问题讨论】:
-
因为除非文件不存在,否则您的代码不会启动 else 块,看来您有两个无意义的 (!file.exists()) 检查。
-
@Stultuske 这是一个并发环境,其他进程可能正在写入该文件。
标签: java multithreading double-checked-locking