在try
块下面,必须按顺序执行3个语句。陈述是否有可能无序运行? JVM是否在j.u.c类中向前看以查看同步指示符(synchronized,volatile)并确定它不能重新排序执行?
private Deque<Integer> deque = new LinkedList<Integer>();
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
class Producer implements Runnable {
@Override
public void run() {
while (true) {
try {
lock.lock();
deque.add(1);
condition.signalAll();
} finally {
lock.unlock();
}
}
}
}
答案 0 :(得分:1)
JVM理解并遵守订购,以便您无法观察到任何非法行为。它可以(并将会)在您无法观察到的区域中采取捷径。这通常适用于Java代码,特别是j.u.c类(其中JVM知道其可以进一步优化的同时保持安全。)
答案 1 :(得分:1)
JVM永远不会重新排序函数调用,除非它完全内联它们。任何副作用都可以隐藏在它们后面,所以除非它能证明不是这样,否则它不能重新排序。