我同步了一个静态方法和一个非静态方法,如下所示:
public class Demo {
static int myvalue;
synchronized static public void getStatic() {
myvalue = 2;
}
synchronized public void get() {
myvalue = 1;
}
}
然后从线程1中我只调用了静态方法,而从线程2中我只调用了非静态方法。
由于一个调用被锁定在对象上而另一个调用被锁定在类上,因此无需等待锁定。
因此,这意味着两个函数可以同时运行。
现在,事实是两个函数都在静态成员变量上工作(示例中为myvalue)。这可能是多线程应用程序中的问题。为什么Java创建者没有考虑到这一点?什么是处理这种情况的正确方法?
答案 0 :(得分:3)
为什么Java创建者没有考虑到这一点?
他们这样做了,这就是为什么你可以选择在类和对象级别上进行同步。
处理这种情况的正确方法是什么?
您必须在get()方法中使用synchronized(Demo.class) {...}
。
答案 1 :(得分:0)
在单个对象或类上同步,例如
public class Demo {
static int myvalue;
static public void getStatic() {
synchronized(Demo.class) {
myvalue = 2;
}
}
public void get() {
synchronized(Demo.class) {
myvalue = 1;
}
}
}