Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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 需要手动同步对已同步列表/地图/集合等的访问_Java - Fatal编程技术网

Java 需要手动同步对已同步列表/地图/集合等的访问

Java 需要手动同步对已同步列表/地图/集合等的访问,java,Java,Collection类提供了获取线程安全集合的各种方法。那么为什么在迭代时需要手动同步访问?每个方法都是线程安全的。如果对同步集合进行多次调用,则这不是线程安全的,除非显式持有锁。使用迭代器需要隐式地对迭代器进行多次调用,因此没有办法解决这个问题 一些并发库集合所做的是提供弱一致性。它们提供了一个实用的解决方案,即在迭代时可以看到或不看到添加或删除的元素 以不安全的方式使用线程安全集合的简单示例 private final List<String> list = Collectio

Collection类提供了获取线程安全集合的各种方法。那么为什么在迭代时需要手动同步访问?

每个方法都是线程安全的。如果对同步集合进行多次调用,则这不是线程安全的,除非显式持有锁。使用迭代器需要隐式地对迭代器进行多次调用,因此没有办法解决这个问题

一些并发库集合所做的是提供弱一致性。它们提供了一个实用的解决方案,即在迭代时可以看到或不看到添加或删除的元素


以不安全的方式使用线程安全集合的简单示例

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说它是同步的呢?每个单独的操作都是同步的,但顺序中的多个操作不会作为一个组同步,除非您显式地这样做。该类及其所有方法都是线程安全的,但这并不禁止您以不安全的方式组合使用它们。