java - 如何正确使用synchronized?

标签 java android synchronized synchronized-block

这段代码:

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/

相关文章:

java - GWT 验证输入到文本框中的时间 - 将长类型结果转换为 24 小时格式时出错

java - 使用 CountDownTimer 方法暂停循环,直到方法完成

java - 如何确保传递给方法的集契约(Contract)步?

java - 读取和写入共享线程变量

java - GLSL 阵列不工作

java - 如何检查数据库表中是否存在字符串

Java:注释中注释的目的?

android - 验证视频 View appium (java) android

linux - "synchronized I/O"总是意味着 "blocking I/O"吗?

static - @Singleton 与 @ApplicationScope