Java 需要手动同步对已同步列表/地图/集合等的访问
Collection类提供了获取线程安全集合的各种方法。那么为什么在迭代时需要手动同步访问?每个方法都是线程安全的。如果对同步集合进行多次调用,则这不是线程安全的,除非显式持有锁。使用迭代器需要隐式地对迭代器进行多次调用,因此没有办法解决这个问题 一些并发库集合所做的是提供弱一致性。它们提供了一个实用的解决方案,即在迭代时可以看到或不看到添加或删除的元素Java 需要手动同步对已同步列表/地图/集合等的访问,java,Java,Collection类提供了获取线程安全集合的各种方法。那么为什么在迭代时需要手动同步访问?每个方法都是线程安全的。如果对同步集合进行多次调用,则这不是线程安全的,除非显式持有锁。使用迭代器需要隐式地对迭代器进行多次调用,因此没有办法解决这个问题 一些并发库集合所做的是提供弱一致性。它们提供了一个实用的解决方案,即在迭代时可以看到或不看到添加或删除的元素 以不安全的方式使用线程安全集合的简单示例 private final List<String> list = Collectio
以不安全的方式使用线程安全集合的简单示例
private final List<String> list = Collections.synchronizedList(
new ArrayList<String>());
list.add("hello");
String hi = list.remove(list.size()-1);
private final List=Collections.synchronizedList(
新的ArrayList());
添加(“你好”);
String hi=list.remove(list.size()-1);
添加和删除都是线程安全的,单独使用它们不会出现错误。问题是另一个线程可能会改变调用之间的集合(而不是调用内的集合),从而导致此代码以多种方式中断。您认为这是为什么?什么让你感到困惑?因为作者就是这样写的。“如果你对一个同步的集合进行多次调用,这不是线程安全的”,那么为什么java说它是同步的呢?每个单独的操作都是同步的,但顺序中的多个操作不会作为一个组同步,除非您显式地这样做。该类及其所有方法都是线程安全的,但这并不禁止您以不安全的方式组合使用它们。