3
스레드를 직접 가르치려고하지만 synchronized()를 사용할 수 없습니다. 클래스 테스트에서동기화 이해
나는이 실행 방법과 변수 그리고
static String toggy = "false";
실행 가능한 (MyRunnable)를 선언하고 있습니다 :
@Override
public void run() {
synchronized (toggy) {
System.out.println("toggy for " + name + " BEFORE = " + toggy);
int b = 0;
for(int i=0; i<1000; i++) {
b++;
}
System.out.println("toggy for " + name + " AFTER = " + toggy);
System.out.println("--------------------------------------------\n");
if(toggy.equals("false")) {
toggy = "true";
} else if(toggy.equals("true")) {
toggy = "false";
}
}
}
난이 내가 뭘하는지입니다 이 테스트는 여기에서 :
for (int i = 0; i < 90; i++) {
Runnable task = new Test.MyRunnable(i+"");
Thread worker = new Thread(task);
worker.setName(String.valueOf(i));
// Start the thread, never call method run() direct
worker.start();
}
내가 이해 한 바에 따르면 동기화 된 블록은 "토글 (toggy)"값이 변경되지 않도록해야한다. 특정 스레드가 실행 중일 때 하지만 지금 당장이 프로그램을 실행하면됩니다. 내가 뭘 놓치고 있니?
synchronized ("false")
{
}
또는 : toggy
다른 값 (String
인스턴스)에 할당하여
감사합니다. hmjd. 나는 "토기 (toggy)"의 다른 가치에 대한 이슈를 이해하고 있다고 생각합니다. 그러나 "잠금 장치"를 동기화하는 것이 트릭을 만드는 이유는 무엇입니까? 그래서 값이 변하지 않는 객체를 동기화 할 수 있습니까? 의미있는 값을 가진 객체를 동기화하는 것이 언제 올바른가요? – Eddy
여기에 대한 자세한 설명은 http://stackoverflow.com/questions/3369287/synchronized-block-lock-object-question을 참조하십시오. – Eddy