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

时间:2014-11-30 17:33:09

标签: java multithreading concurrency

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

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

}
  

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

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

  

根据以下答案,我得到的印象是,如果有这样的州   要使线程安全,那么两个锁都应该由a保持   正在更新此状态的线程,或确保正在访问它的线程   通过静态方法或仅非静态方法。正确?

2 个答案:

答案 0 :(得分:5)

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

synchronized (A.class) {
...

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

答案 1 :(得分:0)

它不是线程安全的,你(问题作者)非常清楚解释了为什么。