Java 如何防止ConcurrentModificationException?

Java 如何防止ConcurrentModificationException?,java,multithreading,sockets,Java,Multithreading,Sockets,我有一些代码,允许服务器生成一些地形,然后通过数据报包将数据发送到单独的客户端程序。接收此数据的客户端的伪代码如下所示: -client sends SYN message to server -server responds with ACK message (using 2-step SYNACK) -client sends request for terrain from x=0 to x=32 -server responds with 32 seperate packets, one

我有一些代码,允许服务器生成一些地形,然后通过数据报包将数据发送到单独的客户端程序。接收此数据的客户端的伪代码如下所示:

-client sends SYN message to server
-server responds with ACK message (using 2-step SYNACK)
-client sends request for terrain from x=0 to x=32
-server responds with 32 seperate packets, one for each x (to keep packet size small)
-client receives packets and puts data into an ArrayList
在我当前的解决方案中,客户机同时运行两个线程,一个用于将数据绘制到屏幕的图形线程和一个数据包接收器线程(数据报套接字中的.receive()函数在收到数据包之前一直挂起)

当前,如果32个地形数据包中的一个在图形更新方法运行时到达,则会发生并发修改异常

我想到了两种可能的解决办法:

  • 在数据包到达时保存数据包,并在图形线程中处理数据包(但是,如果数据包在图形挂起时到达得太快,则可能会导致数据包丢失)
  • 使用可在图形更新中设置的变量使数据包接收器挂起

  • 但这两种解决方案似乎都不理想,而且都有其缺陷。我的问题有一个好的解决方案吗?如果没有,那么上面哪种解决方案最适合使用?

    我建议使用队列在线程之间传递数据,而不是列表或集合

    如果使用ArrayBlockingQueue或ConcurrentLinkedQueue之类的并发队列,这两种队列都不会触发CME


    注意:我建议您避免使用迭代器,而是调用
    take()
    poll()
    从队列中提取事件。

    我建议使用队列在线程之间传递数据,而不是列表或集合

    如果使用ArrayBlockingQueue或ConcurrentLinkedQueue之类的并发队列,这两种队列都不会触发CME


    注意:我建议您避免使用迭代器,而是调用
    take()
    poll()
    从队列中提取事件。

    次要问题:如果使用UDP和数据报数据包,您不一定能获取所有数据,对吗?那么为什么要使用这个呢?问题2:什么类型的GUI?您是否考虑过显示相关代码?@HovercraftFullOfEels 1)是的,为了解决这个问题,我计划使用确认数据包,但稍后我会实现它,无论我如何处理数据检查,我都需要确保代码不会崩溃。2) JFrame GUI显示带有BuffereImage backbuffer的图形2D。有很多代码分布在很多类中,我将在下一次编辑文章时包含相关代码。Peter Lawrey有你的解决方案。附带问题:如果你使用UDP和数据报数据包,你不能保证获得所有数据,对吗?那么为什么要使用这个呢?问题2:什么类型的GUI?您是否考虑过显示相关代码?@HovercraftFullOfEels 1)是的,为了解决这个问题,我计划使用确认数据包,但稍后我会实现它,无论我如何处理数据检查,我都需要确保代码不会崩溃。2) JFrame GUI显示带有BuffereImage backbuffer的图形2D。有很多代码分布在很多类中,我将在下一次编辑文章时包含相关代码。Peter Lawrey有你的解决方案。