是从静态方法线程保存的静态方法调用

时间:2015-04-08 09:38:16

标签: java thread-safety

当我在静态java方法中使用静态属性时,此方法不再是线程保存。

在静态java方法中使用静态方法怎么样?这会弄乱我的价值观吗?

这里有一些例子:

我想这根本不是线程保存:

public static String staticText;
public static Integer staticNumber;

public static String doA(String input1, Integer input2){

    staticText = input1;
    staticNumber = input2;

    return staticText + staticNumber;
}

这将是线程保存:

public static String doB(String input1, Integer input2){
    return input1 + input2;
}

现在我的问题是,这个方法是什么:

public static String doC(String input1, Integer input2){
    return doB(input1, input2);
}

方法doC仍然是线程保存吗?我只是想确保在doC内调用doB的方法不会制动线程安全。

2 个答案:

答案 0 :(得分:5)

static和线程安全没有任何关系。一个定义一个字段是否与整个类(static)或实例(不是static)相关。另一个涉及线程并发和/或序列化。

如果你从另一个静态方法调用的静态方法做了一些可能有问题的事情,如果由多个线程同时完成,你需要以通常的方式处理它(同步,使用java.util.concurrent等的各种功能。方法为static的事实,以及从另一个static方法调用的事实,与它完全没有任何关系。

答案 1 :(得分:0)

我认为一些一般的经验法则会对你有所帮助:

只要你只使用局部变量,所有方法(静态或非静态)都是线程安全的,因为局部变量会为每次调用重新实例化,因此不会干扰线程。

如果您创建一个类的新实例作为局部变量,那么访问该实例的实例字段也将是线程安全的。

如果您写入静态字段,那么这不是线程安全的,因为可以从同一个类加载器中的任何位置访问静态字段(通常这意味着在运行的JVM中的任何位置)。写入静态字段将使另一个线程同时写入它可能会导致奇怪的效果。

你真的应该试着理解你的问题中的术语是什么意思。你现在问的方式表明你没有掌握这些概念。您可以在线找到大量有关此内容的信息,例如: