, 우리는 다음과 같은 코드Windows의 경쟁 조건을 가진 프로그램,하지만 우분투에서 경쟁 조건을 강조하기 위해 설계 과제에
public class IncreaseDecrease {
public static int IntegerVariable = 0;
public static final int NUM_ITER = 5000000;
public static void main(String[] args) throws Exception {
Increase inc;
Decrease dec;
while (true) {
inc = new Increase();
dec = new Decrease();
inc.start();
dec.start();
inc.join();
dec.join();
System.out.println(IntegerVariable);
IntegerVariable = 0;
Thread.sleep(750);
}
}
}
class Increase extends Thread {
@Override
public void run() {
for (int i = 0; i < IncreaseDecrease.NUM_ITER; i++) {
IncreaseDecrease.IntegerVariable++;
}
}
}
class Decrease extends Thread {
@Override
public void run() {
for (int i = 0; i < IncreaseDecrease.NUM_ITER; i++) {
IncreaseDecrease.IntegerVariable--;
}
}
}
각 스레드는 업데이트 할 수 있습니다 경우 0을 인쇄 할 것으로 예상된다이 코드를 받았다 없습니다 다른 값이 읽기 전에 값이 읽히지 만 경쟁 조건으로 인해 발생하지 않으면 -5000000에서 5000000 사이의 값을 인쇄 할 수 있습니다. Windows 및 repl.it에서이 코드를 실행하여 예상 출력을 얻었습니다. -310951 -1918567 -3374495 -3219135 -2286639 -3221055 -3794319 -2442047 -2776415 -3617391
하지만 우분투에서는 실행할 때마다 매번 0을주었습니다.
제 질문은 왜 이런 일입니까? 우분투는 스레드를 다르게 관리합니까, 아니면 내 컴퓨터의 특별한 경우입니까?
편집 : 다른 방법으로 증가분을 넣고 한 번 더 작업을 추가 한 후 경쟁 조건을 관찰했습니다.
public class IncreaseDecrease {
public static int IntegerVariable = 0;
public static final int NUM_ITER = 5000000;
public static void main(String[] args) throws Exception {
Increase inc;
Decrease dec;
while (true) {
inc = new Increase();
dec = new Decrease();
inc.start();
dec.start();
inc.join();
dec.join();
System.out.println(IntegerVariable);
IntegerVariable = 0;
Thread.sleep(750);
}
}
public static void increment()
{
IntegerVariable++;
double a = Math.pow(3, 7);
}
public static void decrement()
{
IntegerVariable--;
double a = Math.pow(3, 7);
}
}
class Increase extends Thread {
@Override
public void run() {
for (int i = 0; i < IncreaseDecrease.NUM_ITER; i++) {
IncreaseDecrease.increment();
}
}
}
class Decrease extends Thread {
@Override
public void run() {
for (int i = 0; i < IncreaseDecrease.NUM_ITER; i++) {
IncreaseDecrease.decrement();
}
}
}
당신은 우분투로 부팅하거나 VirtualBox와 같은 VM에서 실행할 수 있습니까? 어쩌면 VM에서 단일 CPU 코어 만 할당 되었습니까? – user158037
예. 난 하나의 코어와 VirtualBox에 우분투를 사용하고 있습니다. – mahdiou
4 코어와 함께 사용하면 첫 번째 2 번의 반복에 대한 경쟁 조건이 나타 났지만 Simunov의 응답을 사용하여 코어 1 개를 사용해도 원하는 결과를 얻을 수있었습니다. – mahdiou