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

时间:2014-11-04 23:18:40

标签: java multithreading

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

public class Demo {

static int myvalue;

synchronized static public void getStatic() {

    myvalue = 2;
}

synchronized public void get() {

    myvalue = 1;
}
}

然后从线程1中我只调用了静态方法,而从线程2中我只调用了非静态方法。

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

因此,这意味着两个函数可以同时运行。

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

2 个答案:

答案 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;
        }
    }
}