Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList上的同步_Java_Android_Multithreading_Arraylist - Fatal编程技术网

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块解决了这个问题。