我正在尝试自学线程,但似乎无法同步()工作。这就是我正在做的事情:
在课堂测试中我宣布一个变量
static String toggy = "false";
然后使用此run方法运行runnable(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();
}
根据我的理解,synchronized块应该防止“toggy”的值在某个线程运行时发生变化。但是,当我不时地运行程序时,它确实会运行。我错过了什么?
答案 0 :(得分:4)
通过为String
分配不同的值(toggy
个实例),synchronized
块锁定了不同的对象:
synchronized ("false")
{
}
或:
synchronized ("true")
{
}
这将允许多个线程输入synchronized
要保护的块代码。使用其他对象进行锁定:
static final Object lock = new Object();
synchronized (lock)
{
}