2012-11-09 98 views
3

我想教自己的線程,但似乎無法得到同步()的工作。這是我在做什麼:瞭解同步

在一類測試,我聲明一個變量

static String toggy = "false"; 

然後可運行(MyRunnable)這個run方法:

@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」的值改變而某個線程正在運行。但是,當我運行程序時不時就會發生。我錯過了什麼?

回答

4

通過向toggy分配不同的值(String實例)中,​​塊被鎖定不同的對象:

synchronized ("false") 
{ 
} 

或:

synchronized ("true") 
{ 
} 

這將允許多個線程進入塊代碼​​是爲了保護。使用不同的對象進行鎖定:

static final Object lock = new Object(); 

synchronized (lock) 
{ 
} 
+0

謝謝hmjd。我想我理解這個問題與「toggy」的不同價值。但是爲什麼同步「鎖定」這個技巧呢?那麼,我可以在價值不變的任何對象上同步?什麼時候對具有有意義的值的對象進行同步是正確的? – Eddy

+0

關於此的更多討論http://stackoverflow.com/questions/3369287/synchronized-block-lock-object-question – Eddy