最终变量声明在方法中的作用是什么?

Fin*_*arr 7 java methods concurrency final

简单服务器的经典示例:

class ThreadPerTaskSocketServer {
   public static void main(String[] args) throws IOException {
      ServerSocket socket = new ServerSocket(80);
      while (true) {
          final Socket connection = socket.accept();
          Runnable task = new Runnable() {
              public void run() {
                 handleRequest(connection);
              }
          };
          new Thread(task).start();
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

为什么要Socket宣布为final?是因为Thread处理请求的新函数可以引用回方法中的socket变量并导致某种情况ConcurrentModificationException

Mic*_*rdt 13

在这种情况下,变量必须是最终的,才能在匿名实现中使用Runnable.

这是因为当变量已经超出范围并因此消失时,该对象将存在.该对象获取变量的副本.为了隐藏它,变量必须是最终的,以便没有人可以期望一个副本中的更改对另一个副本可见.