java - 具有两种同步方法的线程安全性,一种是静态的,一种是非静态的

标签 java multithreading static synchronized

如果一个类只有两个同步方法(静态或非静态),则该类被认为是线程安全的。如果其中一种方法是静态的,另一种方法是非静态的怎么办?它仍然是线程安全的吗?或者如果多个线程调用这些方法可能会发生不好的事情?

有一些类似的线程,例如 static synchronized and non static synchronized methods in threads这描述了方法调用不会互相阻塞。但我很想知道线程安全领域中的坏事(如不一致的状态、竞争条件等)是否会发生。

编辑1:
由于静态方法不能调用非静态方法,因此从这一点来说应该不存在线程冲突。另一方面,如果非静态方法调用静态方法,则它必须获取类锁。这仍然是线程安全的。因此,通过只有两种方法(一种静态方法,一种无方法),我没有看到任何线程冲突。是对的吗?换句话说,我看到的唯一有问题的情况是非静态方法访问某些静态变量时。但是,如果所有访问都是通过方法完成的,那么我看不到任何线程安全问题。这些是我的想法。我不确定我是否在这里遗漏了一些东西,因为我对 java 并发有点陌生。

最佳答案

在 Java 中,如下:

public class MyClass
{
    public synchronized void nonStaticMethod()
    {
        // code
    }

    public synchronized static void staticMethod()
    {
        // code
    } 
}

相当于以下内容:

public class MyClass
{
    public void nonStaticMethod()
    {
      synchronized(this)
      {
          // code
      }
    }

    public void static staticMethod()
    {
      synchronized(MyClass.class)
      {
          // code
      }
    } 
}

如您所见,静态方法使用 this 作为监视器对象,非静态方法使用类对象作为监视器。

由于 thisMyClass.class 是不同的对象,静态和非静态方法可以同时运行。

<小时/>

要“修复”此问题,请创建一个专用的静态监视器对象并在静态和非静态方法中使用它:

public class MyClass
{
    private static Object monitor = new Object(); 

    public void nonStaticMethod()
    {
      synchronized(monitor)
      {
          // code
      }
    }

    public static void staticMethod()
    {
      synchronized(monitor)
      {
          // code
      }
    } 
}

关于java - 具有两种同步方法的线程安全性,一种是静态的,一种是非静态的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27039943/

相关文章:

java - CPU线程、内核线程、操作系统线程、用户线程之间的区别

C# 线程 : Exercises for beginners

python - 修复了带有线程锁的 strptime 异常,但会减慢程序速度

javascript - 使用字符串键和字符串值声明静态 Javascript 映射的正确方法

java - 其他类能够访问对象类型的数组列表

java - 如何在一项 Activity 上扩展两个类(class)

java - gRPC - 找不到方法

java - 如何使用 to_char 函数按条件添加到 Criteria 订单

java - Spock-Test-Framework 中的 Mock-Signature 似乎与文档中的不同

java - 为什么我不能在 Java 中使用 "static import" "equals"方法?