gpt4 book ai didi

java - 如何正确使用synchronized?

转载 作者:行者123 更新时间:2023-11-30 09:46:15 24 4
gpt4 key购买 nike

这段代码:

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 个线程,一个用于计算和绘图,一个用于用户输入。我需要比我想象的更多地研究这个问题。

最佳答案

你正在做的事情看起来是对的……但仅此而已:

  1. 同步什么对象并不重要,不必是列表本身。
  2. 重要的是在访问共享资源时所有线程是否总是在同一个对象上同步。
  3. 对 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com