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

2022-09-02 01:12:07

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

例如:

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

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

  1. 当我调用每个线程时,我能否保证线程安全?test()test()

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

附言:我知道在这种情况下,静态是完全没有意义的。我在我们的遗留代码中找到了它;我只是想确保我所知道的!


答案 1

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

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

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

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

寄件人: http://tutorials.jenkov.com/java-concurrency/thread-safety.html


答案 2

当我在每个线程中调用 test() 时,我能保证 test() 是线程安全的吗?

是的,如果在 test() 方法中您正在处理方法局部变量,则它是线程安全的。

test() 中的局部变量存储在哪里?每个线程的堆栈?堆空间?

方法 局部变量存储每个线程自己的堆栈。


推荐