В следующем коде ReentrantLock используется для предотвращения создания нечетных чисел с помощью метода next(). Но метод next() генерирует нечетные числа. Но если я изменю его на nextWithTry, он не генерирует нечетные числа. Может ли кто-нибудь объяснить причину этого?Состояние гонки в Java с ReentrantLock
class Generator{
Lock l = new ReentrantLock();
volatile int c = 0;
public int next(){
l.lock();
c++; c++;
l.unlock();
return c;
}
public int nextWithTry(){//This method works fine...
try{
l.lock();
c++; c++;
return c;
}finally{
l.unlock();
}
}
}
class W implements Runnable{
private Generator r;
public W(Generator r){
this.r = r;
}
@Override
public void run() {
int x;
while(true){
if(((x = r.next()) % 2) != 0){
System.out.println(x + " odd number Found");
break;
}
}
}
}
public class Testing {
public static void main(String[] args) {
Generator r = new Generator();
W w1 = new W(r);
new Thread(w1).start();
new Thread(w1).start();
}
}
Я использую java версию 1.7.0_51 с eclipse JUNO. Я пробовал без изменчивости. То же самое происходит. – maamaa
@BoristheSpider Я считаю, что у вас есть правильный ответ. Проблема с упорядочением, но это не в оптимизации jit, а в самом коде, как вы указываете. –