android同步方法无法按预期工作

android同步方法无法按预期工作,android,opengl-es-2.0,synchronized,Android,Opengl Es 2.0,Synchronized,所以我有一个类,它包含一个要在屏幕上呈现的项目的arrayList,使用Opengl ES 2.0 我有一个方法可以遍历列表,并在屏幕上绘制它 @Override public void onDrawFrame(GL10 gl10) { drawItems(); } public static final Object mutex = new Object(); drawItems(){ synchronized(mutex){ for (Item item : mItemLis

所以我有一个类,它包含一个要在屏幕上呈现的项目的arrayList,使用Opengl ES 2.0

我有一个方法可以遍历列表,并在屏幕上绘制它

@Override
public void onDrawFrame(GL10 gl10) {
  drawItems();
}

public static final Object mutex = new Object();

drawItems(){
 synchronized(mutex){
   for (Item item : mItemList){
     drawItem(item);
   }
 }
}
在包含列表的类上:

class ItemListClass{

  private ArrayList<Item> mList;
  ...

  public void addItem(Item item){
    synchronized(Renderer.mutex){
       mList.add(item);
     }
 }
 public void removeItem(int pos){
    synchronized(Renderer.mutex){
      mList.remove(pos);
    }
 }
class项目列表类{
私有数组列表;
...
公共无效附加项(项目){
已同步(Renderer.mutex){
列表添加(项目);
}
}
公共无效删除项(int pos){
已同步(Renderer.mutex){
mList.remove(位置);
}
}
现在,我仍然得到一个java.util.ConcurrentModificationException


< P >我误解了同步关键字的使用吗?或者我在这里丢失了什么?如果你在修改<代码>列表,而不是线程-REF时,可以抛出“< /p> <代码> CONTRONMONTIOGIVATION异常/CODE >,不管线程-REF:对于同步的<代码>列表<代码>,请考虑<代码> CopyOnWorksRayList< /COD>
synchronized
块的d-这是维护同步的
列表的一种简单得多的方法。是的,但我认为由于for循环在同步范围内,它会工作。我熟悉CopyOnwriteArrayList,我不明白为什么此代码不工作。
drawItem(item)是什么
do?您的
ArrayList
也应该是一个
volatile
变量。无论是哪种方式,您要么在2+个线程上以某种方式修改集合,要么在代码中某个地方迭代列表时进行变异-可能提供的代码不是完整的
列表
接触点?@ariel t在h在渲染循环中修改列表,对于解决方案,我还使用了CopyOnWriteArrayList集合。@MarkKeen在再次查看代码时,有一个地方我用来清除列表,在那里我没有添加到同步块中。我这样做了,到目前为止我还没有遇到另一个异常……我希望就是这样,似乎很难找到Ebbug这些问题,在我做出更改之前复制错误是不简单的。如果您正在修改<代码>列表<代码>,则可以在重复该列表的同时抛出该错误,而不考虑线程-REF:对于同步<代码>列表<代码>,请考虑<代码> CopyOnWorksRayList< /COD>而不是synchronized
块-这是维护同步的
列表的一种简单得多的方法。是的,但我认为由于for循环在同步范围内,它会工作。我熟悉CopyOnwriteArrayList,我只是不明白为什么此代码不工作。
drawItem(item)是什么
do?您的
ArrayList
也应该是一个
volatile
变量。无论是哪种方式,您要么在2+个线程上以某种方式修改集合,要么在代码中某个地方迭代列表时进行变异-可能提供的代码不是完整的
列表
接触点?@ariel t在h在渲染循环中修改列表,对于解决方案,我还使用了CopyOnWriteArrayList集合。@MarkKeen在再次查看代码时,有一个地方我用来清除列表,在那里我没有添加到同步块中。我这样做了,到目前为止我还没有遇到另一个异常……我希望就是这样,似乎很难找到对于这些问题,在我做出更改之前复制错误并不简单