[code=java
/**
* 被打的人
*
* @author [email protected]
*
*/
public class ManBall extends Spirit { /**
* 能被碰撞的东西
*/
private List<Collideable> collideables = new ArrayList<Collideable>();@Override
public void move(float x, float y) {
synchronized (collideables) {
if (collideables != null) {
for (Collideable collideable : collideables) {
if (collideable.checkCollide(this, (int) x, (int) y)) {
CollideEvent collideEvent = new CollideEvent();
collideEvent.setCollideable(collideable);
collideListener.onCollide(collideEvent);
}
}
}
}
super.move(x, y);
}
][/code]
/**
* 被打的人
*
* @author [email protected]
*
*/
public class ManBall extends Spirit { /**
* 能被碰撞的东西
*/
private List<Collideable> collideables = new ArrayList<Collideable>();@Override
public void move(float x, float y) {
synchronized (collideables) {
if (collideables != null) {
for (Collideable collideable : collideables) {
if (collideable.checkCollide(this, (int) x, (int) y)) {
CollideEvent collideEvent = new CollideEvent();
collideEvent.setCollideable(collideable);
collideListener.onCollide(collideEvent);
}
}
}
}
super.move(x, y);
}
][/code]
看下面的代码
/**
* 被打的人
*
* @author [email protected]
*
*/
public class ManBall extends Spirit { /**
* 能被碰撞的东西
*/
private List<Collideable> collideables = new ArrayList<Collideable>();
@Override
public void move(float x, float y) {
if (collideListener != null) {
synchronized (collideables) {
if (collideables != null) {
for (Collideable collideable : collideables) {
if (collideable.checkCollide(this, (int) x, (int) y)) {
CollideEvent collideEvent = new CollideEvent();
collideEvent.setCollideable(collideable);
collideListener.onCollide(collideEvent);
}
}
}
}
}
super.move(x, y);
}
/**
* 添加一个要被检测的可碰撞的东西
*
* @param collideable
*/
public void addCollideable(Collideable collideable) {
synchronized (collideables) {
collideables.add(collideable);
}
}
/**
* 删除一个要被检测的可碰撞的东西
*
* @param collideable
*/
public void removeCollideable(Collideable collideable) {
synchronized (collideables) {
collideables.remove(collideable);
}
}
}
add和remove分别是对这个集合的增加删除操作
我都加了synchronized (collideables)
不知道是不是这样写,反正是执行remove的时候报了这样的一个错
java.util.ConcurrentModificationException
在执行for (Collideable collideable : collideables) {}的时候
里面的代码,比如
collideEvent.setCollideable(collideable);
collideListener.onCollide(collideEvent);这两句会不会去调用addCollideable或者removeCollideable或者对collideables执行其他删除、添加元素的方法。在你遍历的时候collideables,如果有这种操作,就会产生java.util.ConcurrentModificationException
这个我以前碰到过。
怎么解决呢?我已经用synchronized 锁住了呀,锁住还不能执行remove吗?
不知道你能否理解
我再说的通俗一点吧。你是一个线程,我也是一个线程。
第一种情况
比如你负责遍历集合,我往集合离插入或者删除元素。
现在你锁了对象锁,开始遍历。我要执行插入或者删除元素时,发现拿不到锁。要等你遍历完了释放了,我在往操作。这种情况是没问题的。第二种情况
你自己拿了锁,开始遍历集合。在循环中,你自己对集合进行了插入或者删除元素(你自己描述的:确实调用了remove)。这种情况是会报java.util.ConcurrentModificationException 的