假设我有一个类定义为:
public class MyClass {
private static int data;
public static staticMethod(int val){
... do something with data based on val ...
}
}
Run Code Online (Sandbox Code Playgroud)
现在让我们说我的应用程序中运行了许多Java线程来调用静态方法
MyClass.staticMethod(int)
Run Code Online (Sandbox Code Playgroud)
该方法会在每次调用时阻塞吗?即,如果线程1首先调用该方法并且正在执行该方法的运行,则线程2调用静态方法,第二个线程是否必须等到第一次执行完成?
如果答案是否定的,那么何时以非同步方式使用静态数据成员是否有意义?
该方法会在每次调用时阻塞吗?
不。普通static方法不会阻塞其他线程。(但是一个static synchronized方法可以阻塞其他线程……或者被其他线程阻塞。)
如果答案是否定的,那么什么时候以非“同步”的方式使用静态数据成员才有意义?
如果成员是volatile...模数 volatile 的限制,则数据成员是可以的。
如果数据成员是final对线程安全类型的引用,则可以。
如果数据成员是线程限制的,则可以。(这不太可能,因为该成员由于是 对所有线程可见static。但这是可能的。)
如果其他东西正在处理同步,或者如果您使用Lock对象进行互斥等,那也没关系……尽管您可能会说这些“不算数”。
| 归档时间: |
|
| 查看次数: |
946 次 |
| 最近记录: |