了解同步

时间:2012-11-09 13:55:58

标签: java multithreading runnable

我正在尝试自学线程,但似乎无法同步()工作。这就是我正在做的事情:

在课堂测试中我宣布一个变量

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”的值在某个线程运行时发生变化。但是,当我不时地运行程序时,它确实会运行。我错过了什么?

1 个答案:

答案 0 :(得分:4)

通过为String分配不同的值(toggy个实例),synchronized块锁定了不同的对象:

synchronized ("false")
{
}

或:

synchronized ("true")
{
}

这将允许多个线程输入synchronized要保护的块代码。使用其他对象进行锁定:

static final Object lock = new Object();

synchronized (lock)
{
}