0

关于 Java 同步,我尝试了一个示例(来自 TLF-SOFT-VTC.java.6CFE),但结果是错误的,为什么它不同步?编码 :

public class InterferenceFix extends Thread {
    String name;
    static boolean isZero = true;
    static int counter = 0;

    public static void main(String arg[]) {
        InterferenceFix one = new InterferenceFix("one");
        InterferenceFix two = new InterferenceFix("two");
        one.start();
        two.start();
    }

    InterferenceFix(String nameString) {
        name = nameString;
    }

    public void run() {
        for (int i = 0; i < 100000; i++) {
            update();
        }
        System.out.println(name + ": " + counter);
    }

    synchronized void update() {
        if (isZero) {
            isZero = false;
            counter++;
        } else {
            isZero = true;
            counter--;
        }
    }
}
4

2 回答 2

5

只有你的update方法是同步的,这意味着循环可以在两个线程上同时运行,只有它update本身不能。

另外-synchronized关键字实际上锁定在对象上this,在您的情况下,我们谈论的是 2 个不同的实例,这意味着它们锁定在不同的this. 这意味着主动 - 线程不会以任何方式干扰彼此的工作,并且它们可以同时运行。

如果这确实是你想要的,你可能会更好地创建一个静态锁:

private static final Object lock = new lock();

并将其更改update(或运行)为:

void update() {
     synchronized (lock) {
        if (isZero) {
             isZero = false;
             counter++;
        } else {
             isZero = true;
             counter--;
        }
    }
}

如果您需要同步 for 循环,只需在循环周围而不是 inside 以相同的方式使用锁update

于 2013-09-21T22:52:13.813 回答
4

synchronized在实例方法上只是序列化每个实例的调用,synchronized在静态方法上会为每个类执行此操作,因此对于所有调用。所以他们有不同的锁对象。现在可以猜到,static synchronized可以使用一种方法来修改这些静态字段。

于 2013-09-21T22:55:54.960 回答