Java JVM优化会破坏我的代码吗?

Java JVM优化会破坏我的代码吗?,java,jvm,jit,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.

我有以下被多个线程调用的方法:

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优化器是否可能注释掉上面给定方法中标记为(1)的代码?我怀疑是因为,目录的存在被立即连续检查了两次。将其视为不必要的冗余检查JVM优化器可能会注释掉第-->(1)行

否。它不会被优化


如果JVM优化了一个标准的双重检查锁模式,那就有点垃圾了。

否。它不会被优化


如果JVM优化了一个标准的双重检查锁模式,那就有点垃圾了。

否。它不会被优化


如果JVM优化了一个标准的双重检查锁模式,那就有点垃圾了。

否。它不会被优化


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

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

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

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

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

正如@yshavit所指出的那样


因为文件方法最终将作为操作系统调用结束,JVM不能假设这些方法没有副作用(并且不受参数以外的状态的影响),所以JVM不会优化涉及
if(!File.exists()| |!File.isDirectory())的代码
注释该部分。

正如@yshavit所指出的那样


因为文件方法最终将作为操作系统调用结束,JVM不能假设这些方法没有副作用(并且不受参数以外的状态的影响),所以JVM不会优化涉及
if(!File.exists()| |!File.isDirectory())的代码
注释该部分。

正如@yshavit所指出的那样


因为文件方法最终将作为操作系统调用结束,JVM不能假设这些方法没有副作用(并且不受参数以外的状态的影响),所以JVM不会优化涉及
if(!File.exists()| |!File.isDirectory())的代码
注释该部分。

正如@yshavit所指出的那样



因为文件方法最终将作为操作系统调用结束,JVM不能假设这些方法没有副作用(并且不受参数以外的状态的影响),所以JVM不会优化涉及
if(!File.exists()| |!File.isDirectory())的代码
注释掉该部分。

JVM永远无法优化包含方法调用的表达式,因为它不知道这些方法调用是否有副作用。JVM只优化字节码,而不是java代码。它通过采用comon java模式并将其映射到更高效的字节码形式来进行优化。它从不“优化你的java”@DaoWen不一定。如果已知某个函数没有任何副作用,则可以对其进行优化。一个简单的例子是
布尔doNothing(){return true;}
。但在本例中,您的陈述是正确的,因为
文件
方法最终将作为操作系统调用结束,JVM不能假定这些方法没有副作用(并且不受除参数以外的状态的影响)。@Mac。首先,方法可以内联;方法中的代码被“复制粘贴”到调用站点,从而节省了调用方法的开销。此外,如果该方法没有任何副作用,并且总是返回相同的值(或者可能返回不同的值,但该值从未被使用过——老实说,我不确定优化会走多远),则可以完全删除该方法。您可以在中看到一个示例。如果JVM没有优化这些方法,那将需要很长时间。@Mac这不仅仅是冗余调用,如果每个冗余调用都可以被证明没有任何作用。但基本上,优化器的一般规则是,“如果你能看出它在那里,除非看到方法运行得更快,那么它就坏了。”JVM永远无法优化包含方法调用的表达式,因为它不知道这些方法调用是否有副作用。JVM只优化字节码,而不是java代码。它通过采用comon java模式并将其映射到更高效的字节码形式来进行优化。它从不“优化你的java”@DaoWen不一定。如果已知某个函数没有任何副作用,则可以对其进行优化。一个简单的例子是
布尔doNothing(){return true;}
。但在本例中,您的陈述是正确的,因为
文件
方法最终将作为操作系统调用结束,JVM不能假定这些方法没有副作用(并且不受除参数以外的状态的影响)。@Mac。首先,方法可以内联;方法中的代码被“复制粘贴”到调用站点,从而节省了调用方法的开销。此外,如果该方法没有任何副作用,并且总是返回相同的值(或者可能返回不同的值,但该值从未被使用过——老实说,我不确定优化会走多远),则可以完全删除该方法。您可以在中看到一个示例。如果JVM没有优化这些方法,那将需要很长时间。@Mac这不仅仅是冗余调用,如果每个冗余调用都可以被证明没有任何作用。但基本上优化器的一般规则是,“如果你能知道它在那里,除非你看到方法运行得更快,那么它就坏了。”JVM永远无法优化包含方法调用的表达式,因为它不知道这些方法调用是否有副作用。JVM只优化字节码,而不是java