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」的值改變而某個線程正在運行。但是,當我運行程序時不時就會發生。我錯過了什麼?
謝謝hmjd。我想我理解這個問題與「toggy」的不同價值。但是爲什麼同步「鎖定」這個技巧呢?那麼,我可以在價值不變的任何對象上同步?什麼時候對具有有意義的值的對象進行同步是正確的? – Eddy
關於此的更多討論http://stackoverflow.com/questions/3369287/synchronized-block-lock-object-question – Eddy