您的位置:首页技术文章
文章详情页

Java:单线程集合遍历时,删除元素为何不导致fail-fast事件?

【字号: 日期:2024-01-30 15:46:22浏览:76作者:猪猪

问题描述

http://blog.csdn.net/lw305080...里有如下代码,while (ite.hasNext()) 代码块里有 ite.remove();删除元素为何不导致fail-fast事件?

public void listen() throws Exception { System.out.println('start server'); // 轮询访问selector while (true) { // 当注册事件到达时,方法返回,否则该方法会一直阻塞 selector.select(); // 获得selector中选中的相的迭代器,选中的相为注册的事件 Iterator ite = this.selector.selectedKeys().iterator(); while (ite.hasNext()) { SelectionKey key = (SelectionKey) ite.next(); // 删除已选的key 以防重负处理 ite.remove(); // 客户端请求连接事件 if (key.isAcceptable()) { ServerSocketChannel server = (ServerSocketChannel) key.channel(); // 获得和客户端连接的通道 SocketChannel channel = server.accept(); // 设置成非阻塞 channel.configureBlocking(false); // 在这里可以发送消息给客户端 channel.write(ByteBuffer.wrap(new String('hello client').getBytes())); // 在客户端 连接成功之后,为了可以接收到客户端的信息,需要给通道设置读的权限 channel.register(this.selector, SelectionKey.OP_READ); // 获得了可读的事件 } else if (key.isReadable()) { read(key); } }

问题解答

回答1:

在单线程中,使用Iterator删除元素是正确的做法。

回答2:

SelectionKey key = (SelectionKey) ite.next(); // 删除已选的key 以防重负处理 ite.remove(); //这样不会fail-fast//this.selector.selectedKeys().remove(key); 这样才会fail-fast

至于原理可以看这篇文章:http://blog.csdn.net/ld513508...

标签: java