2012-11-09 6 views
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 인스턴스)에 할당하여

답변

4

synchronized 블록은 다른 개체 잠그고이 다수의 스레드가 블록 코드를 입력 할 수

synchronized ("true") 
{ 
} 

그런 synchronized은 보호하기위한 것입니다. 잠금을 위해 다른 객체 사용 :

static final Object lock = new Object(); 

synchronized (lock) 
{ 
} 
+0

감사합니다. hmjd. 나는 "토기 (toggy)"의 다른 가치에 대한 이슈를 이해하고 있다고 생각합니다. 그러나 "잠금 장치"를 동기화하는 것이 트릭을 만드는 이유는 무엇입니까? 그래서 값이 변하지 않는 객체를 동기화 할 수 있습니까? 의미있는 값을 가진 객체를 동기화하는 것이 언제 올바른가요? – Eddy

+0

여기에 대한 자세한 설명은 http://stackoverflow.com/questions/3369287/synchronized-block-lock-object-question을 참조하십시오. – Eddy