Java 多线程之间的共享数据和唯一数据

Java 多线程之间的共享数据和唯一数据,java,multithreading,Java,Multithreading,在Java中,哪些代码在多个线程之间共享,哪些代码被复制以用于一个特定线程 如果考虑下面的片段也会更精确。 public void foo () { int a = 0; a++; } 由多个线程并发执行时,每个线程都会保存变量a的自己的副本,还是在线程之间共享?否,a是一个局部变量。这意味着对foo的每次调用都会得到自己的独立变量——无论是在多个线程中还是在同一线程中递归调用 请注意,这不是关于共享代码,而是关于共享数据。相同的代码将在所有线程中运行(很可能),但每次调用

在Java中,哪些代码在多个线程之间共享,哪些代码被复制以用于一个特定线程

如果考虑下面的片段

也会更精确。
public void foo () {

    int a = 0;

    a++;
}

由多个线程并发执行时,每个线程都会保存变量
a
的自己的副本,还是在线程之间共享?

否,
a
是一个局部变量。这意味着对
foo
的每次调用都会得到自己的独立变量——无论是在多个线程中还是在同一线程中递归调用


请注意,这不是关于共享代码,而是关于共享数据。相同的代码将在所有线程中运行(很可能),但每次调用都将使用一组单独的局部变量。

否,
a
是一个局部变量。这意味着对
foo
的每次调用都会得到自己的独立变量——无论是在多个线程中还是在同一线程中递归调用

请注意,这不是关于共享代码,而是关于共享数据。相同的代码(很可能)将在所有线程中运行,但每次调用都将使用一组单独的局部变量。

这是一个很好的问题

在一般情况下使用线程时,理解这一点非常重要

在您的例子中,由于a是在函数foo中声明的,因此它是线程的本地。因此,所有线程都应该有自己的变量副本

假设a在这个函数之外声明,那么它将是全局的,您可能需要使用Lock来确保a由每个线程更新

问得好

在一般情况下使用线程时,理解这一点非常重要

在您的例子中,由于a是在函数foo中声明的,因此它是线程的本地。因此,所有线程都应该有自己的变量副本


假设a在这个函数之外声明,那么它将是全局的,您可能需要使用Lock来确保a由每个线程更新

乔恩,非常感谢你。非常感谢你的帮助。乔恩,非常感谢。非常感谢您的帮助。谢谢您的回复。谢谢您的回复。