Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是来自静态方法线程保存的静态方法调用_Java_Thread Safety - Fatal编程技术网

Java 是来自静态方法线程保存的静态方法调用

Java 是来自静态方法线程保存的静态方法调用,java,thread-safety,Java,Thread Safety,当我在静态java方法中使用静态属性时,这个方法不再是线程保存 在静态java方法中使用静态方法怎么样?这会打乱我的价值观吗 这里有一些例子: 我想这根本不是线程保存: public static String staticText; public static Integer staticNumber; public static String doA(String input1, Integer input2){ staticText = input1; staticNu

当我在静态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);
}

方法文档仍然是线程保存吗?我只是想确保对doB inside doC的方法调用不会阻止线程安全。

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


如果您从另一个静态方法调用的静态方法执行了一些由多个线程同时执行可能会有问题的操作,则需要以通常的方式(使用
java.util.concurrent
的各种功能进行同步等)来处理这些操作。该方法是
静态的
,并且它是从另一个
静态的
方法调用的,这一事实与它毫无关系。

静态的
和线程安全性之间没有任何关系。一个定义字段是与类作为一个整体(
static
)还是与实例(而不是
static
)相关。另一个涉及线程并发和/或序列化


如果您从另一个静态方法调用的静态方法执行了一些由多个线程同时执行可能会有问题的操作,则需要以通常的方式(使用
java.util.concurrent
的各种功能进行同步等)来处理这些操作。该方法是
静态的
,并且它是从另一个
静态的
方法调用的,这一事实与此完全无关。

我认为一些一般的经验法则将帮助您:

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

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

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

你真的应该试着理解你问题中的术语是什么意思。你现在的提问方式表明你没有掌握这些概念。你可以在网上找到很多关于这方面的信息,例如:


一些我认为可以帮助您的一般经验法则:

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

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

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

你真的应该试着理解你问题中的术语是什么意思。你现在的提问方式表明你没有掌握这些概念。你可以在网上找到很多关于这方面的信息,例如:


什么值?你的问题太模糊,目前无法回答。静态方法并没有神奇地使它们成为线程安全或线程不安全的方法,您需要准确地指定这些术语的含义。静态和非静态方法都可能是线程安全或不安全的。两者都可以同步,也可以不同步。这只取决于你的设计。这取决于你在方法内部做什么。取决于您是否仅使用本地字段/静态字段/实例字段等“当我在静态java方法中使用静态属性时,此方法不再是线程保存”。当您使用非静态java方法中的静态属性时,该方法也会变为非线程安全。值是什么?你的问题太模糊,目前无法回答。静态方法并没有神奇地使它们成为线程安全或线程不安全的方法,您需要准确地指定这些术语的含义。静态和非静态方法都可能是线程安全或不安全的。两者都可以同步,也可以不同步。这只取决于你的设计。这取决于你在方法内部做什么。取决于您是否仅使用本地字段/静态字段/实例字段等“当我在静态java方法中使用静态属性时,此方法不再是线程保存”。当您使用非静态java方法中的静态属性时,该方法也变得非线程安全。