如果一个类只有两个同步方法(静态或非静态),则该类被认为是线程安全的。如果其中一种方法是静态的,另一种方法是非静态的怎么办?它仍然是线程安全的吗?或者如果多个线程调用这些方法可能会发生不好的事情?
有一些类似的线程,例如 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
作为监视器对象,非静态方法使用类对象作为监视器。
由于 this
和 MyClass.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/