一尘不染

静态方法和线程安全中的局部变量

java

我有一个关于可变范围的问题。

例如:

class A {
    private static void test() {
        // do something with local variables
    }
}

现在,我创建两个线程,并A为每个线程创建一个实例。

  1. 当我test()在每个线程中调用时,可以保证test()线程安全吗?

  2. 本地变量test()存储在哪里?每个线程的堆栈?堆空间?

PS我知道在这种情况下,静态是毫无意义的。我在我们的旧代码中找到了它;我只是想确定我所知道的!


阅读 322

收藏
2020-12-03

共1个答案

一尘不染

局部变量存储在每个线程自己的堆栈中。这意味着局部变量永远不会在线程之间共享。这也意味着所有本地原始变量都是线程安全的。

对对象的本地引用有些不同。引用本身未共享。但是,引用的对象没有存储在每个线程的本地堆栈中。所有对象都存储在共享堆中。如果本地创建的对象从不转义其创建方法,则该线程安全。实际上,您也可以将其传递给其他方法和对象,只要这些方法或对象都没有使传递的对象可用于其他线程。

对象成员与对象一起存储在堆中。因此,如果两个线程在同一对象实例上调用一个方法,并且此方法更新对象成员,则该方法不是线程安全的。

线程安全检查:如果在同一线程的控制范围内创建,使用和配置了资源,并且从未逃避该线程的控制,则使用该资源是线程安全的。

来自:http :
//tutorials.jenkov.com/java-concurrency/thread-
safety.html

2020-12-03