java - 了解同步

标签 java multithreading runnable

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

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

static String toggy = "false"; 

然后使用这个运行方法的可运行的(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 block)应该防止“toggy”的值在某个线程运行时发生变化。但是当我时不时地运行程序时,它确实如此。我错过了什么?

最佳答案

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

synchronized ("false")
{
}

或:

synchronized ("true")
{
}

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

static final Object lock = new Object();

synchronized (lock)
{
}

关于java - 了解同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13309412/

相关文章:

java - 在使用 OpenSSL 生成的 Android/Java 中加载 RSA key ?

java - 错误: Could not find or load main class - Youtube Data API example

java - 如何获取已终止的 Java 线程的中断状态?

java - 为什么在 public void run() 中这里不需要 try-catch?

java - Runnable 根本不在 fragment 内运行

java - ImageView 留有大量可用空间

java - 如何在 Android 中多次调用一个方法

c++ - 尝试使用 std::vector<std::thread> 时出现静态断言失败错误

具有持久资源的 Java 线程

java - java.util.function 中的 Runnable 表示是什么?