android同步方法无法按预期工作
所以我有一个类,它包含一个要在屏幕上呈现的项目的arrayList,使用Opengl ES 2.0 我有一个方法可以遍历列表,并在屏幕上绘制它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
@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在再次查看代码时,有一个地方我用来清除列表,在那里我没有添加到同步块中。我这样做了,到目前为止我还没有遇到另一个异常……我希望就是这样,似乎很难找到对于这些问题,在我做出更改之前复制错误并不简单