为什么局部变量在 Java 中线程安全

2022-08-31 10:14:41

我正在阅读Java中的多线程,我遇到了这个

局部变量在 Java 中是线程安全的。

从那时起,我一直在思考如何/为什么局部变量是线程安全的。

有人可以让我知道。


答案 1

当您创建线程时,它将创建自己的堆栈。两个线程将有两个堆栈,一个线程从不与其他线程共享其堆栈。

程序中定义的所有局部变量都将在堆栈中分配内存(正如Jatin所评论的那样,这里的内存意味着对象的引用值和基元类型的值)(线程调用的每个方法都会在其自己的堆栈上创建一个堆栈帧)。一旦此线程完成方法执行,堆栈帧将被删除。

斯坦福大学教授在youtube上有很棒的演讲,这可能有助于你理解这个概念。


答案 2

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

public void someMethod(){

   long threadSafeInt = 0;

   threadSafeInt++;
}

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


推荐