java - 静态同步方法和非静态同步方法都可以作用于静态成员变量,这可能会导致意外行为

标签 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 的创建者没有考虑到这一点?处理这种情况的正确方法是什么?

最佳答案

Why do the Java creators didn't take this into account?

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

What can be the right way of dealing with this type of situation?

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

关于java - 静态同步方法和非静态同步方法都可以作用于静态成员变量,这可能会导致意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26746919/

相关文章:

java - 使用Gson库将Java String对象转换为Json

java - 删除单链表中的最后一个元素

java - 使用 java 执行时,Shell 脚本中的 Mkdir 未在 mac OS 中创建文件夹

c# - 如何正确使用实时优先级

java - 如何在没有内存可见性影响的情况下使一组语句原子化?

java - 如何延迟一个方法

java - 显示一个窗口以获取用户输入

c++ - C++中的多线程: The correct way to join threads

java - JTextArea追加问题

c# - 连接池-一个进程-多个线程