java中静态变量的线程安全性

AKS*_*AKS 0 java concurrency multithreading

我的问题与静态变量的线程安全性有关.

Class A{
private static int test=0;
public static void synchronized  m1(){
    test=test+1;
}
public void synchronized  m2(){
   test=test+1;
}

}
Run Code Online (Sandbox Code Playgroud)

如果两个线程,t1具有静态锁定,t2具有对象锁定,可以同时继续,那么A类的状态测试将如何是线程安全的?

可能是,我遗漏了一些非常基本的东西,但不确定它是如何工作的.

基于以下答案,我得到的印象是,如果必须使这些状态成为线程安全的,那么两个锁都应该由更新此状态的线程保持,或者确保仅通过静态方法或仅通过静态方法访问它非静态方法.对?

kih*_*eru 5

这不是线程安全的.这些方法使用不同的监视器对象:静态方法使用类,实例方法使用对象实例进行同步.您可以通过以下方式使实例方法将该类用作监视器对象:

synchronized (A.class) {
...
Run Code Online (Sandbox Code Playgroud)

如果你需要.我会考虑将这两种方法都设置为静态,除非您需要访问实例变量.