Java 静态同步方法和非静态同步方法都可以处理静态成员变量,这可能导致意外行为

Java 静态同步方法和非静态同步方法都可以处理静态成员变量,这可能导致意外行为,java,multithreading,Java,Multithreading,我同步了静态方法和非静态方法,如下所示: public class Demo { static int myvalue; synchronized static public void getStatic() { myvalue = 2; } synchronized public void get() { myvalue = 1; } } 然后从线程1我只调用静态方法,从线程2我只调用非静态方法 由于一个调用锁定在对象上,另一个调用锁定在类上,因此无需等待获得锁 这

我同步了静态方法和非静态方法,如下所示:

public class Demo {

static int myvalue;

synchronized static public void getStatic() {

    myvalue = 2;
}

synchronized public void get() {

    myvalue = 1;
}
}
然后从线程1我只调用静态方法,从线程2我只调用非静态方法

由于一个调用锁定在对象上,另一个调用锁定在类上,因此无需等待获得锁

这意味着这两个函数可以同时运行


现在,事实是这两个函数都作用于静态成员变量(示例中为myvalue)。这在多线程应用程序中可能是一个问题。为什么Java创建者没有考虑到这一点?处理这种情况的正确方法是什么?

在单个对象或类上同步,例如

public class Demo {

    static int myvalue;

    static public void getStatic() {
        synchronized(Demo.class) {
            myvalue = 2;
        }
    }

    public void get() {
        synchronized(Demo.class) {
            myvalue = 1;
        }
    }
}
为什么Java创建者没有考虑到这一点

他们做到了,这就是为什么您可以选择在类和对象级别上同步

处理这种情况的正确方法是什么


您必须在get()方法中使用
synchronized(Demo.class){…}

这不起作用,因为在
static
方法中没有
This
参考。在这两种情况下,您可以在
Demo.class
上进行同步。但是在静态方法中没有“this”的概念。