如何防止ConcurrentModificationException?

时间:2016-05-08 18:27:37

标签: 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 for each x (to keep packet size small)
-client receives packets and puts data into an ArrayList

在我目前的解决方案中,客户端运行两个同时线程,一个用于将数据绘制到屏幕的图形线程,以及一个数据包接收器线程(因为数据报套接字中的.receive()函数挂起,直到收到数据包)

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

我想到了两种可能的解决方案:

  1. 在数据包到达时保存数据包并在图形线程中处理它(但是如果数据包挂起时它们到达太快,可能会导致数据包丢失)。
  2. 使用变量使数据包接收器挂起,可以在图形更新中设置。
  3. 这些解决方案似乎都不合理,但两者都存在缺陷。我的问题是否有一个很好的解决方案,如果没有,那么上述哪种解决方案最好用?

1 个答案:

答案 0 :(得分:4)

我建议使用Queue在线程之间传递数据,而不是List或Set。

如果您使用像ArrayBlockingQueue或ConcurrentLinkedQueue这样的并发队列,则这些队列都不会触发CME。

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