멀티 스레딩에서 레이스 조건을 수행하고 경쟁 조건을 야기하는 상황을 만들려고 생각했지만 동일한 결과를 얻을 때마다 간단한 프로그램을 작성했습니다. 이것이 레이스 컨디션의 올바른 상황인지 알아야합니다. 아래자바 멀티 스레딩 레이스 조건 시나리오
코드 :
package com.threads;
/**
* demonstrate race conditions
*/
public class Step4 {
public int getA() {
return a;
}
public void addToA(int number) {
for(int i=0;i<number;i++)
this.a = this.a + 1;
}
int a = 2;
static Step4 s4 = new Step4();
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
s4.addToA(5);
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
s4.addToA(3);
}
});
Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
s4.addToA(6);
}
});
Thread thread4 = new Thread(new Runnable() {
@Override
public void run() {
s4.addToA(4);
}
});
thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread1.join();
thread2.join();
thread3.join();
thread4.join();
System.out.println(s4.getA());
}
}
// 출력은 내 컴퓨터, Win7에 32 비트에서 항상 20입니다.
각 스레드가 여기에서 거의 작동하지 않아서 전혀 겹치지 않을 가능성이 매우 높습니다. –
4 개의 스레드가 모두 완료 될 때까지 기다리는 중입니다 (join() 메서드). ** println **이 호출되면 내용은 항상 20입니다. 따라서 경쟁 조건을 시뮬레이트하지 않습니다. –
숫자를 훨씬 더 크게 만드십시오. 경쟁 조건은 예측할 수 없으므로 각 스레드가 더 많은 시간을 소비하게되면 발생 가능성이 높아집니다. – Kiskae