【问题标题】:Understanding Synchronized了解同步
【发布时间】:2012-11-09 13:55:57
【问题描述】:

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

在一个类测试中我声明了一个变量

static String toggy = "false"; 

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

【问题讨论】:

    标签: java multithreading runnable


    【解决方案1】:

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

    synchronized ("false")
    {
    }
    

    或:

    synchronized ("true")
    {
    }
    

    这将允许多个线程输入synchronized 旨在保护的块代码。使用不同的对象进行锁定:

    static final Object lock = new Object();
    
    synchronized (lock)
    {
    }
    

    【讨论】:

    • 谢谢hmjd。我想我理解“toggy”不同价值观的问题。但是为什么在“锁定”上同步会奏效呢?那么,我可以同步任何价值不变的对象吗?什么时候对具有有意义值的对象进行同步是正确的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多