如果 class 有一个内部 class 并且内部 class 运行一个线程,内部 class 线程是否与外部 class 线程共享相同的字段其他?

If a class has an inner class and the inner class runs a thread, do the inner class threads share the same fields of the outer class with one another?

基本上,如果我有代码:

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() 时,每个线程都有自己的计数器版本,还是它们都共享相同版本的计数器?我假设它们都共享相同的版本,因为它是一个内部 class,但每个线程都有自己的堆栈,所以我不确定。

他们将共享相同的 counter

如果您只有一个 Outer 实例,您将只有一个 counter 实例。所有线程将共享它。

重要!验证从不同线程访问计数器的并发性和可见性问题。很可能您需要使用 AtomicInteger 而不是“int”或将所有访问代码(用于写入和读取操作)包装到一个同步块中。