我有一个由多个线程调用的方法:
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)。
发布于 2014-06-23 05:01:48
正如@yshavit所指出的
因为File方法最终将作为OS调用结束,而且JVM不能假设这些方法没有副作用(并且不受它们的参数以外的状态的影响),所以JVM不会通过注释掉该部分来优化涉及if(!file.exists() || !file.isDirectory())的代码。
发布于 2014-06-17 21:00:27
不是的。它不会被优化。
如果JVM优化了一个标准的双重检查锁模式,那就有点垃圾了。
发布于 2014-06-17 21:01:11
不是的。编译器优化不会改变程序的流程。具体来说,方法调用永远不会被跳过。
https://stackoverflow.com/questions/24273146
复制相似问题