我有以下方法,由多个线程调用:
private final static Object lock = new Object();
public String createDirectory()
{
File file = new File("D:"+File.separator+"test");
if(!file.exists() || !file.isDirectory())//if file doesn't exist then create a new directory.
{
synchronized(lock)
{
if(!file.exists() || !file.isDirectory())//----> (1)
{
boolean isCreated = file.mkdir();
}
}
}
return file.getAbsolutePath();
}
JVM优化器是否有可能在上面给出的menthod中注释掉标记为(1)的代码?我怀疑是因为,目录的存在立即被连续两次检查。将其视为不必要的冗余检查JVM优化器可能会注释掉该行 - > (1)。
答案 0 :(得分:1)
没有。它不会被优化。
如果JVM优化了标准的双重检查锁定模式,那将会有点垃圾。
答案 1 :(得分:1)
没有。编译器优化不会改变程序的流程。具体来说,永远不会跳过方法调用。
答案 2 :(得分:1)
正如@yshavit所指出的
因为File方法最终将作为OS调用结束,并且JVM不能假设那些没有副作用(并且不受其参数影响的状态)因此,JVM不会通过注释掉该部分来优化涉及if(!file.exists() || !file.isDirectory())
的代码。