这段代码:
synchronized (mList) {
if (mList.size() != 0) {
int s = mList.size() - 1;
for (int i = s; i > 0; i -= OFFSET) {
mList.get(i).doDraw(canv);
}
getHead().drawHead(canv);
}
}
随机抛出 AIOOBE。根据我的阅读,同步应该可以防止这种情况发生,那么我做错了什么?
编辑:
AIOOBE = 数组索引越界异常 代码不完整,减少到需要的部分。但是为了让你高兴,OFFSET 是 4,想象一下有一个 for 循环在开始时添加了一点数据。还有第二个线程读取和/或修改列表。
编辑 2:
我注意到在绘制列表和当前游戏结束时会发生这种情况。当列表为空时,绘图线程尚未绘制所有元素。有没有办法告诉游戏等待清空列表直到它为空?
编辑 3:
我刚刚注意到我不确定这是否是一个多线程问题。似乎我只有 2 个线程,一个用于计算和绘图,一个用于用户输入。我需要比我想象的更多地研究这个问题。
最佳答案
你正在做的事情看起来是对的……但仅此而已:
- 同步什么对象并不重要,不必是列表本身。
- 重要的是在访问共享资源时所有线程是否总是在同一个对象上同步。
- 对 SWING(或其他图形库)的任何访问都必须在 AWT 线程中进行。
您的编辑:
I've noticed it happens when the list is being drawn and the current game ends. The draw-thread hasn't drawn all elements when the list is emptied. Is there a way of telling the game to wait with emtying the list untill it's empty?
我认为您的意思是“...等待清空列表,直到绘图完成。”只需同步在同一个锁上执行此操作的代码(即您的情况下的列表本身)。
再说一次:对共享资源的任何访问都必须以某种方式受到保护。您似乎只是在这里而不是清空列表的地方使用了synchronized
。
关于java - 如何正确使用synchronized?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7230337/