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