Java 为什么不同步?

Java 为什么不同步?,java,synchronized,Java,Synchronized,关于Java synchronized,我尝试了一个示例(来自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[]) {

关于Java synchronized,我尝试了一个示例(来自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--;
        }
    }
}
public类InterferenceFix扩展线程{
字符串名;
静态布尔值为零=真;
静态整数计数器=0;
公共静态void main(字符串arg[]){
InterferenceFix one=新的InterferenceFix(“一”);
InterferenceFix two=新的InterferenceFix(“two”);
一、启动();
二、启动();
}
干扰修复(字符串名称字符串){
name=名称字符串;
}
公开募捐{
对于(int i=0;i<100000;i++){
更新();
}
System.out.println(name+“:”+计数器);
}
同步的无效更新(){
如果(为零){
isZero=假;
计数器++;
}否则{
isZero=真;
计数器--;
}
}
}

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

另外,
synchronized
关键字实际上锁定了对象
this
,在您的例子中,我们讨论了两个不同的实例,这意味着它们锁定了不同的
this
。这意味着,主动线程不会以任何方式干扰彼此的工作,它们可以同时运行

如果这确实是您想要的,那么您最好创建一个静态锁:

private static final Object lock = new lock();
并将更新(或运行)更改为:


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

synchronized
只对每个实例的调用进行序列化,而静态方法上的
synchronized
会对每个类进行序列化,因此对所有调用都是如此。所以它们有不同的锁对象。现在大家可以猜到,可以使用
静态同步
方法来修改这些静态字段。

一定要用
@Override
注释标记
run()
。另外:每天使用牙线,过马路前要查看两边。
update()
也可以在两个线程上同时运行;没有什么可以阻止它们,因为两个线程正在不同的对象上同步。谢谢大家,根据你们所说的,我在update()方法之前添加了一个“static”,它可以工作。
void update() {
     synchronized (lock) {
        if (isZero) {
             isZero = false;
             counter++;
        } else {
             isZero = true;
             counter--;
        }
    }
}