Was ich in diesem Zusammenhang noch interessant finde ist, das ein synchronized Wrapper in diesem Fall gar nichts bewirkt, wahrscheinlich weil ich von 2 verschiedenen Referenzen auf die Liste zugreife.
[code=Java]
package threadtest1;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class Main {
private final List<String> list;
public Main() {
list = Collections.synchronizedList(new ArrayList<String>());
ListIteration li = new ListIteration();
li.start();
while(true) {
// synchronized(list) {
for(int i = 0; i < 5; i++) {
list.add("Hallo" + i);
}
for(Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String next = iterator.next();
System.out.println("im EDT");
}
li.setList(list);
}
// }
}
public static void main(String[] args) {
new Main();
}
}
class ListIteration extends Thread {
private List<String> list;
public ListIteration() {
list = new ArrayList<String>();
}
public void setList(List<String> list) {
this.list = Collections.synchronizedList(list);
}
@Override
public void run() {
while(true) {
final List l = this.list;
//synchronized(l) {
for(Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
final String next = iterator.next();
System.out.println("im Thread");
iterator.remove();
}
// }
}
}
}
[/code]