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”的概念。