У меня вопрос о переупорядочении кода и условиях гонки в Java.
Предположим, у меня есть следующий код с двумя или более потоками, выполняющими одновременно workForThread()
:
public class Job {
private Lock lock = new ReentrantLock();
private int sharedObject = 1;
public void workForThread() {
lock.lock();
try {
sharedObject++;
} finally {
lock.unlock();
}
}
}
Возможно ли, что JVM может выполнить это в неправильном порядке? Например, возможно ли следующее переупорядочение?:
sharedObject++;
lock.lock();
lock.unlock();
Или гарантировано, что блокировка не будет переупорядочена?