Java – how does the behavior differ between these two synchronous usages in the list?
•
Java
List<String> list = new ArrayList<String>();
List<String> list = new ArrayList<String>();
list.add("a");
...
list.add("z");
synchronized(list) {
Iterator<String> i = list.iterator();
while(i.hasNext()) {
...
}
}
and
List<String> list = new ArrayList<String>();
list.add("a");
...
list.add("z");
List<String> synchronizedList = Collections.synchronizedList(list);
synchronized(synchronizedList) {
Iterator<String> i = synchronizedList.iterator();
while(i.hasNext()) {
...
}
}
Specifically, when synchronized lists provide thread safe access to lists, I don't know why synchronization is needed in the second instance
Solution
If you do not lock the iteration, if another thread modifies it during the loop, you will get a concurrentmodificationexception
Synchronizing all methods does not prevent this from happening
This (and many other things) is collections The reason why synchronized * is completely useless You should use Java util. Class in concurrent You should think carefully about how to ensure your safety
The general rule of thumb is:
For more information, see my blog
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码
