아래는 상호 배제에 대해 배우기 시작한 자바 프로그램입니다.이 프로그램이 무한 루프로 실행되는 이유는 무엇입니까? 상호 배제
class MutexVar{
public static int Turn = 1;
}
class CriticalSection{
private static int modelNumber =0;
public static void setModelNumber(int number){
modelNumber = number;
}
public static int getModelNumber(){
return modelNumber;
}
}
public class MutualExclusion{
public static void main(String[] args){
Thread threadObjRef = new Thread(new Runnable(){
public void run(){
int autoVar = 1;
int newModelNumber = -1;
while(true){
/* Non - critical section - start */
System.out.println("\n" + "In run() thread");
/* Non - critical section - end */
while(MutexVar.Turn == 2){
//System.out.println("loop-run"); //infinite loop problem is here
}
/* Critical Section -start */
CriticalSection.setModelNumber(autoVar);
newModelNumber = CriticalSection.getModelNumber();
MutexVar.Turn = 2;
/* Critical Section -end */
/* Non - critical section - start */
System.out.println("run() thread: " + newModelNumber + "\n");
autoVar = autoVar + 2;
/* Non - critical section - end */
}
}
});
threadObjRef.start();
int autoVar = 0;
int newModelNumber = -1;
while(true){
/* Non - critical section - start */
System.out.println("\n" + "In main thread");
/* Non - critical section - end */
while(MutexVar.Turn == 1){
//System.out.println("loop-main"); //infinite loop problem is here
}
/* Critical Section -start */
CriticalSection.setModelNumber(autoVar);
newModelNumber = CriticalSection.getModelNumber();
MutexVar.Turn = 1;
/* Critical Section -end */
/* Non - critical section - start */
System.out.println("main- thread: " + newModelNumber + "\n");
autoVar = autoVar + 2;
/* Non - critical section - end */
}
}
}
내 질문 :
1) MutexVar.Turn
를 설정하는 두 스레드 간의 데이터 경주가 있습니까?
2) 아니요,이 프로그램은 나에게 잘 어울립니다.하지만 내 프로그램은 아래 출력으로 무한 루프됩니다. 왜 무한 루프 loop-run
또는 loop-main
?
In main thread
In run() thread
run() thread: 1
In run() thread
내 관찰 :
이 스레드 스케줄링 문제처럼 보인다. 나는 그들이 내부적으로 의 CreateThread()
api를 사용하고 윈도우즈에서 1-1 스레딩 모델로 OS에 의해 스케줄되어지기 때문에 자바 쓰레드가 Windows OS에서 볼 수 있다는 것을 배웠다. 자바 프로그램은 Windows 7 멀티 코어 OS에서 java jdk 1.6을 사용하여 실행됩니다.
OS가 두 스레드간에 인터리빙하지 않는 이유는 무엇입니까? 나는 이것이 내가 이해하고자하는 요점이라고 생각한다. 특정 언어로 작성된 프로그램은 문제가 될 수 없습니다. – overexchange