当前位置: 首页 > 知识库问答 >
问题:

ConcurrentModificationException,即使使用同步

童宏富
2023-03-14

我有两个线程:第一个是渲染线程,第二个线程是我处理UI动作的主线程。

我得到以下错误:

java。util。java上的ConcurrentModificationException。util。AbstractList$SimpleListator。接下来(AbstractList.java:95)在com上。对流塔。Android棋盘。棋盘。renderGamerPieces(ChessBoard.java:424)位于com。康瓦克塔。Android棋盘。棋盘。在com上渲染(ChessBoard.java:162)。康瓦克塔。Android棋盘。棋子线。运行(ChessDrawThread.java:41)

ConcurrentModification异常的常见原因是迭代列表的更改,但我只在renderGamerPieces函数中读取它。mGamerPieces唯一可能更改的地方是loadPosition方法,但是loadPositionrenderGamerPieces都在同步块内调用

也许我不明白。。那么这个错误是如何出现的呢?

我的代码:

private final List<DrawablePiece> mGamerPieces = new ArrayList<DrawablePiece>();
private final Object mGamerPiecesLock = new Object();

public void loadPosition(byte[] pieces, byte[] places) {
        synchronized (mGamerPiecesLock) {
            mPicked = null;
            mGamerPieces.clear();
            for (int i = 0; i < pieces.length; i++) {
                byte p = GamerUtils.UncastleRook(pieces[i]);
                if (p != GamerPieces.EMPTY) {
                    byte pl = places[i];
                    if (pl <= GAME_BOARDSIZE)
                        mGamerPieces.add(new DrawablePiece(p,
                                GamerUtils.columnByCell(pl), GamerUtils.rowByCell(pl,
                                        true)));
                }
            }
        }
    }

public void renderGamerPieces(Canvas canvas) {
    ...
    Rect r = new Rect(0, 0, mCellSize, mCellSize);
    List<DrawablePiece> over = new ArrayList<DrawablePiece>();

    for (DrawablePiece d : mGamerPieces) {
        if (d.isFloating()) {
            over.add(d);
        } else {
            r.offsetTo(invert(d.getBoardCol()) * mCellSize,
                    invert(d.getBoardRow()) * mCellSize);
            r.offset(mBoardRegion.left, mBoardRegion.top);
            Bitmap pic = mPieceFactory.getBitmapPiece(d.getPiece(),
                    mCellSize);
            if (null != pic)
                canvas.drawBitmap(pic, null, r, null);
        }
    }
    ...
 }

public void render(Canvas canvas) {
        ...
        synchronized (mGamerPiecesLock) {
            renderGamerPieces(canvas);
        }
        ...
}

谢谢你的评论!我将整理我的代码-在renderGamerPieces中添加同步块,并检查是否可以从另一个同步块调用loadPotion

共有1个答案

欧阳骏俊
2023-03-14

我通过使同步块尽可能小来进行代码重构,问题就解决了。显然,随后有一个从一个同步块到另一个同步块的呼叫。

 类似资料:
  • 问题内容: 我使用迭代器遍历一个集合,如下所示: 但是在下面的行中,我得到了ConcurrentModificationException 当我不进行任何更改时,为什么会发生这种情况? 非常感谢 编辑-堆栈跟踪: 问题答案: 您必须修改列表之一: 在方法中的迭代器内部,而无需使用迭代器上的或方法;要么 在另一个线程中 因此,您的例外是预期的行为。从该文档,如果你有一个线程遍历列表: 如果在创建迭代

  • } 正如您所看到的,RetryHandler扩展了线程,该线程在内部列表上迭代。尽管使用了和,我还是得到了和已在其他

  • 从CSV文件中,我读取每一行并创建一个employee对象,然后将其存储到employee的ArrayList中。 在对员工的排序之前: 一旦文件处理完成,我就开始对员工的。 循环迭代器示例: 我的迭代器的实现可能是不正确的,这是第一次直接使用迭代器。

  • 使用Maven引导2。 在我的一个项目中,我们有一个单元测试用例,它在CI/CD和我的一台笔记本电脑中运行良好。 而在我的笔记本电脑中设置相同的项目,却返回了奇怪的异常。 pom.xml Java版本: openjdk版本“11.0.10”2021-01-19 LTS openjdk运行时环境Corretto-11.0.10.9.1(build 11.0.10+9-LTS)openjdk 64位服

  • 问题内容: 错误: 这是什么问题 问题答案: 某处正在修改。我怀疑它可能在此调用内发生: 编辑 基本上,发生的是通过 另一个 迭代器进行的递归修改。这使得外部迭代器的故障快速行为得以解决。 __

  • 我正在使用面临的问题是,当我运行下面的代码时,我得到了。 据我所知,代码应该毫无例外地终止。 有人能帮我理解为什么我会得到这个例外吗。