Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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_Jakarta Ee_Collections_Thread Safety_Thread Synchronization - Fatal编程技术网

Java 为什么有线程安全收集的要求?

Java 为什么有线程安全收集的要求?,java,jakarta-ee,collections,thread-safety,thread-synchronization,Java,Jakarta Ee,Collections,Thread Safety,Thread Synchronization,如果我们可以轻松地将非线程安全集合转换为线程安全集合,那么为什么需要线程安全集合呢 例如:我们可以使用Collections.synchronizedList()方法创建同步的ArrayList。 synchronizedList只需用独占锁包装所有方法。这对你来说可能太严格了。例如,您可能非常希望允许同时进行任意数量的并发读取操作(并且仅序列化写入)。专门的实现可以提供这一点 synchronizedList仅在其内部状态未损坏的意义上是线程安全的。这是你的申请。例如if(list.isEmp

如果我们可以轻松地将非线程安全集合转换为线程安全集合,那么为什么需要线程安全集合呢

例如:我们可以使用Collections.synchronizedList()方法创建同步的ArrayList。

  • synchronizedList
    只需用独占锁包装所有方法。这对你来说可能太严格了。例如,您可能非常希望允许同时进行任意数量的并发读取操作(并且仅序列化写入)。专门的实现可以提供这一点

  • synchronizedList
    仅在其内部状态未损坏的意义上是线程安全的。这是你的申请。例如
    if(list.isEmpty())list.add(1)即使在同步列表上也不是线程安全的。
    for(String x:list)
    也没有为您提供快照迭代。专门的实现可以添加更高级别的原子操作

为什么我们需要线程安全的集合

你不需要它们,因为正如你所指出的


我们可以使用
Collections.synchronizedList()
方法创建同步的
ArrayList

那么,为什么图书馆提供“并发”收藏类呢?这是因为其中一些类可以使用线程安全算法实现,特别是,这可能比使用互斥保护算法更有效或更安全

当然,正如其他人所指出的,对于您的应用程序来说,仅仅保护一个集合可能并不总是足够的。无论如何,您可能需要一个互斥体来保护与集合相关的其他一些数据


但是,如果无锁版本对您有帮助,那么好消息是它们已经存在了;如果它们没有帮助,那么好消息是您不必使用它们。

因为有时您不希望每次访问列表时都进行同步,或者等待某人完成读/写。看看,f.e.
java.util.concurrent.CopyOnWriteArrayList
Collections.synchronizedList
阻止所有其他线程访问该列表。争用可能是不可接受的。还必须注意,
Collections.synchronizedList
的内部属性是线程安全的。这并不一定意味着您的代码通过使用它将是线程安全的。