做静态方法阻塞吗?

时间:2013-09-17 23:41:07

标签: java

假设我有一个定义为:

的类
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 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

,都是如此

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

public static synchronized staticMethod(){

答案 2 :(得分:3)

  

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

没有。普通static方法不会阻止其他线程。 (但static synchronized方法可以阻止其他线程......或被其他线程阻止。)

  

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

  • 如果成员的数据成员是volatile ...模块化volatile的限制,则可以。

  • 如果数据成员是对线程安全类型的final引用,则没有问题。

  • 如果数据成员是线程限制的,则可以。

  • 如果其他东西正在处理同步,或者你正在使用Lock个对象进行互斥等等,这是可以的......虽然你可能会说这些“不计算”

答案 3 :(得分:0)

不,除非类/方法声明为Synchronized

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