【发布时间】:2013-12-25 20:51:29
【问题描述】:
在 Java 中,哪些代码在多个线程之间共享,哪些代码被复制以用于一个特定线程?
如果考虑以下片段,那就太精确了
public void foo () {
int a = 0;
a++;
}
由多个线程同时执行,每个线程会持有自己的变量a的副本还是在线程之间共享?
【问题讨论】:
标签: java multithreading
在 Java 中,哪些代码在多个线程之间共享,哪些代码被复制以用于一个特定线程?
如果考虑以下片段,那就太精确了
public void foo () {
int a = 0;
a++;
}
由多个线程同时执行,每个线程会持有自己的变量a的副本还是在线程之间共享?
【问题讨论】:
标签: java multithreading
不,a 是一个局部变量。这意味着foo 的每次调用都会获得自己的单独变量——无论是在多个线程中,还是在同一个线程中递归。
请注意,这不是关于共享代码,而是关于共享数据。相同的代码将在所有线程中运行(嗯,很可能),但每次调用都将使用一组单独的局部变量。
【讨论】:
非常好的问题。
在一般情况下使用线程时理解这一点非常重要。
在您的情况下,由于 a 在函数 foo 中声明,因此它是线程本地的。因此,所有线程都应该有自己的变量副本。
假设,a 在这个函数之外被声明,那么它将是全局的,你可能必须使用 Lock 来确保 a 被每个单独的线程更新。
【讨论】: