내 운영 체제에서 코드 동작과 혼동을 느끼고 있습니다. 무엇이든간에 올바른 값을 얻으려면 멀티 스레딩을위한 동기화 방법이 많이 있습니다.동기화를 사용하지 않고 내 코드가 완벽하게 작동하는 이유는 무엇입니까?
그래서 나는 항상 올바른 가치를 얻습니다. 동기화 된 방법을 사용하지 않고 ??? !!!
예를 들어 아래의 프로그램이 매우 같은 변수에 액세스 열 개 스레드가 하나하여 증가 .. 등 몇 초 .. 그 연결되어야 후 종료한다 정규 동작 코드 아래
들여다 어떤 경우에는 100000이 아닌 다른 값을가집니다. 그리고 그 루프를 멈추게 할 것입니다. 나는 20 분 넘게이 코드를 실행하고 있습니다 .. 그리고 그것은 완벽하게 작동했습니다 ..
아무도 무슨 일이 일어나는지 말해 줄 수 있습니까? : D ??
내 운영 체제는 윈도우 7 내가 일식 케플러를 사용하고 있습니다 .. ... ..이 2.4 GHZ와 .. 정규 솔로의 JVM은 .. 8 내 CPU는 듀얼 코어 아니다
public class Worker {
int count;
public static void main(String[] args) {
new Worker().run();
}
public void run() {
do {
count = 0;
Thread thread1 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10000; i++) {
count++;
}
}
});
Thread thread2 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10000; i++) {
count++;
}
}
});
Thread thread3 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10000; i++) {
count++;
}
}
});
Thread thread4 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10000; i++) {
count++;
}
}
});
Thread thread5 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10000; i++) {
count++;
}
}
});
Thread thread6 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10000; i++) {
count++;
}
}
});
Thread thread7 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10000; i++) {
count++;
}
}
});
Thread thread8 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10000; i++) {
count++;
}
}
});
Thread thread9 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10000; i++) {
count++;
}
}
});
Thread thread10 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10000; i++) {
count++;
}
}
});
thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread5.start();
thread6.start();
thread7.start();
thread8.start();
thread9.start();
thread10.start();
try {
thread1.join();
thread2.join();
thread3.join();
thread4.join();
thread5.join();
thread6.join();
thread7.join();
thread8.join();
thread9.join();
thread10.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Count is: " + count);
} while (count == 100000);
}
}
@wrongAnswer : 증분이 원자 단위인지 또는 변수의 최신 값에서 작동 하는지를 확인하기 위해 변수를 여러 스레드에서 증가시킵니다. –