Java ArrayList上的同步
我有一个像这样的循环:Java ArrayList上的同步,java,android,multithreading,arraylist,Java,Android,Multithreading,Arraylist,我有一个像这样的循环: synchronized(list) { int objectsN = list.size(); for (int i=0; i < objectsN; i++) { // Do stuff... } } 已同步(列表){ int objectsN=list.size(); for(int i=0;i{//Do stuff…})时,可以使用Collections.synchronizedList(list) 私有列表; 公共
synchronized(list) {
int objectsN = list.size();
for (int i=0; i < objectsN; i++) {
// Do stuff...
}
}
已同步(列表){
int objectsN=list.size();
for(int i=0;i
列表
是包含此代码的对象的最后一个字段
然后,我在同一个对象中有一个方法,它调用list.remove(index)
,当某个线程在无限循环中执行上面的代码列表时(单周期之间有睡眠),它被另一个线程调用,有时它崩溃,产生IndexOutOfBoundsException
如何正确同步此列表?同步remove语句将解决并发问题
synchronized (list) {
list.remove(index);
}
如果您使用Java 8,那么在定义列表并调用list.foreach(currentElement->{//Do stuff…})时,可以使用Collections.synchronizedList(list)
私有列表;
公共建造商(名单){
this.list=Collections.synchronizedList(列表);
}
公共void循环方法(){
foreach(currentElement->{//Do stuff…});
}
公共作废删除方法(整数索引){
list.remove(index);//这假定索引在范围内
}
同步remove语句将解决并发问题
synchronized (list) {
list.remove(index);
}
如果您使用Java 8,那么在定义列表并调用list.foreach(currentElement->{//Do stuff…})时,可以使用Collections.synchronizedList(list)
私有列表;
公共建造商(名单){
this.list=Collections.synchronizedList(列表);
}
公共void循环方法(){
foreach(currentElement->{//Do stuff…});
}
公共作废删除方法(整数索引){
list.remove(index);//这假定索引在范围内
}
如果两个方法想要更改相同的数据,则可以锁定一个公共对象。这里甚至不需要在列表对象上同步,任何对象都可以,但是循环和删除方法都应该使用它。如果两个方法想要更改相同的数据,则想法是锁定一个公共对象。这里甚至不需要在列表对象上同步,任何对象都可以,但是循环和删除方法都应该使用它。您应该看看:您可以显示其他线程的代码吗。此外,无论是否为多线程,如果传递的是不存在的索引,remove将始终引发该异常。@huidube为什么该类优于ArrayList?vector是以同步方式生成的。但你最好看看莱默斯的答案。这甚至是一个更好的选择。你应该看看:你能显示其他线程的代码吗。此外,无论是否为多线程,如果传递的是不存在的索引,remove将始终引发该异常。@huidube为什么该类优于ArrayList?vector是以同步方式生成的。但你最好看看莱默斯的答案。这是更好的选择。谢谢。使用synchronizedList并离开synchronized block解决了这个问题。谢谢。使用synchronizedList和离开synchronized块解决了这个问题。