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类的状态测试将如何是线程安全的?
可能是,我遗漏了一些非常基本的东西,但不确定它是如何工作的.
基于以下答案,我得到的印象是,如果必须使这些状态成为线程安全的,那么两个锁都应该由更新此状态的线程保持,或者确保仅通过静态方法或仅通过静态方法访问它非静态方法.对?
这不是线程安全的.这些方法使用不同的监视器对象:静态方法使用类,实例方法使用对象实例进行同步.您可以通过以下方式使实例方法将该类用作监视器对象:
synchronized (A.class) {
...
Run Code Online (Sandbox Code Playgroud)
如果你需要.我会考虑将这两种方法都设置为静态,除非您需要访问实例变量.
| 归档时间: |
|
| 查看次数: |
3033 次 |
| 最近记录: |