JVM优化是否会破坏我的代码?

时间:2014-06-17 20:57:15

标签: java jvm jit

我有以下方法,由多个线程调用:

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)。

3 个答案:

答案 0 :(得分:1)

没有。它不会被优化。

如果JVM优化了标准的双重检查锁定模式,那将会有点垃圾。

答案 1 :(得分:1)

没有。编译器优化不会改变程序的流程。具体来说,永远不会跳过方法调用。

答案 2 :(得分:1)

正如@yshavit所指出的

因为File方法最终将作为OS调用结束,并且JVM不能假设那些没有副作用(并且不受其参数影响的状态)因此,JVM不会通过注释掉该部分来优化涉及if(!file.exists() || !file.isDirectory())的代码。