基本上,如果我有以下代码:
每次调用makeNewThread()时,每个线程会拥有自己的计数器版本,还是它们都共享同一个计数器版本?我认为它们会共享同一版本,因为这是内部类,但每个线程都有自己的堆栈,所以我不确定。
public class Outer {
public int counter = 0;
public void makeNewThread() {
Thread t1 = new Thread(new Inner());
t1.start();
}
private class Inner implements Runnable {
public void run() { //do stuff involving counter... }
}
}
每次调用makeNewThread()时,每个线程会拥有自己的计数器版本,还是它们都共享同一个计数器版本?我认为它们会共享同一版本,因为这是内部类,但每个线程都有自己的堆栈,所以我不确定。
Outer
的同一实例是被共享的;除非你实例化多个Outer
实例。未使用volatile
(或使用AtomicInteger
)修改counter
不可取。但是,“涉及 counter 的操作”可能会安全地执行,也可能不安全。 - Elliott Frisch