클래스의 메서드에 대한 상호 액세스를 제공해야하므로 한 스레드가 메서드 내에서 코드를 실행할 수 있습니다. 아래의 솔루션을 시도했지만 왜 'locked'변수의 값이 false인지 이해할 수 없습니다.자바 메서드에서 상호 스레드 제외
public class MyCommand extends BaseCommand {
private static boolean locked=false;
@Override
public boolean execute() throws Exception {
synchronized(MyCommand.class){
while (locked){
wait();
}
locked=true;
//some code with a breakpoint/long blocking operations
locked=false;
notifyAll();
return true;
}
}
while 문에 처음에 중단 점을 넣었고 locked 변수의 값이 항상 false이며 이유를 이해할 수 없습니다. 두 번째 중단 점은 메서드 본문에 있으며 첫 번째 스레드의 실행을 차단하고 두 번째 스레드에서 변수의 값이 변경된 것을 확인하기 위해 사용하지만 불행히도 이러한 일은 발생하지 않습니다. 따라서, 최종 결과로서 모든 스레드는 스레드 안전성없이이 메소드를 실행할 수 있습니다. 누구나 시간당 스레드 하나만이 메서드에 단독 액세스를 제공 할 수있는 방법에 대한 아이디어가 있습니까?
this.class 인을 유효한 표현식이 아닙니다. 고쳐주세요. – aioobe
공유 할 수있는 데이터가 없다면 명령은 스레드로부터 안전합니다. 그렇게하는 방법? 참조 매개 변수의 상태를 수정하지 마십시오. 변경할 수있는 클래스 멤버 변수를 만들지 마십시오. 왜 그냥 synchronized 키워드를 추가 할 수 없습니까? – duffymo
'locked' 정적 필드는 필요 없습니다. 'syncronized (MyCommand.class)'로 충분합니다. – kraskevich