6

假设我有一个类定义为:

public class MyClass {

    private static int data;

    public static staticMethod(int val){
      ... do something with data based on val ...
    }
}

现在假设我的应用程序中运行了许多 Java 线程,它们调用静态方法

MyClass.staticMethod(int)

该方法会在每次调用时阻塞吗?即,如果线程1首先调用该方法,并且在执行该方法的运行时,线程2调用静态方法,那么第二个线程是否必须等到第一次执行完成?

如果答案是否定的,那么什么时候以非“同步”的方式使用静态数据成员才有意义?

4

4 回答 4

8

不,这不是static关键字的一部分。如果要同步访问同一方法的两个线程,请使用其他可能性,例如synchronized方法语句)或java.util.concurrent包中的内容。

于 2013-09-17T23:43:22.353 回答
6

该方法会在每次调用时阻塞吗?

不会。普通static方法不会阻塞其他线程。(但是一个static synchronized方法可以阻塞其他线程……或者被其他线程阻塞。)

如果答案是否定的,那么什么时候以非“同步”的方式使用静态数据成员才有意义?

  • 如果数据成员是volatile……以 volatile 的限制为模,则数据成员是可以的。

  • 如果数据成员是final对线程安全类型的引用,则可以。

  • 如果数据成员是线程限制的,则可以。(这是不可能的,因为该成员由于存在而对所有线程可见static。但这是可能的。)

  • 如果其他东西正在处理同步,或者如果您正在使用Lock对象进行互斥等等,这没关系......尽管您可能会说这些“不算数”。

于 2013-09-18T00:17:41.700 回答
4

正如你所写,没有。在另一个线程完成方法执行之前,多个线程不会阻塞。无论方法是否为static.

要强制只有单个线程可以访问该方法,您必须创建该方法synchronized

public static synchronized staticMethod(){
于 2013-09-17T23:43:29.927 回答
0

不,除非类/方法是 declare Synchronized

http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

于 2013-09-17T23:44:03.297 回答