当前位置: 代码迷 >> J2SE >> 求各位指导一个比较奇怪的有关问题
  详细解决方案

求各位指导一个比较奇怪的有关问题

热度:28   发布时间:2016-04-23 20:02:14.0
求各位指导一个比较奇怪的问题
小弟最近在做一个飞机监控系统,属于gis类的吧。不过这个问题无关gis。现在假设有100架飞机,我需要记录每架飞机的飞行路径点。路径点只保留100个点(超过100个删除前面的点)。考虑线程安全的问题  我选择ConcurrentLinkedQueue存储方式存储飞行点。然后将点put到buffer里面用于读取展示。现在出现了一个奇怪的问题。100架飞机100个线程,偶尔会出现,飞行超过100个路径点后有那么2、3个线程在循环ConcurrentLinkedQueue时多循环一次,下面贴一下主要的代码。
private ConcurrentLinkedQueue<Position> points=new ConcurrentLinkedQueue<Position>();
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
for (Position p:points) {
                Vec4 vec4 = globe.computePointFromPosition(p);
                vec4List.add(vec4);
                Vec4 vector = vec4.subtract3(refVec);
                this.pointBuffer.put((float) vector.getX());
                this.pointBuffer.put((float) vector.getY());
                this.pointBuffer.put((float) vector.getZ());
            }
问题就出现在这里,捕捉异常后我输出points确实长度为100。buffer缓冲区大小也确实是300正好够100个点坐标的put。
但是有那么两三个线程在运行到这里的时候会循环101次,那样buffer的缓冲区就不够了会报错。
基于严谨的编程习惯,还是不要调整缓冲区大小了,现在就想问问为什么会多循环一次。
------解决思路----------------------
问题可能不在你贴的这段代码里,应该和多线程同时访问points有关
------解决思路----------------------
看现象应该是线程同步访问数据出现问题了
  相关解决方案