Java中同步和非同步集合类有什么区别?

9

我在阅读Java的集合相关内容时看到了这句话:

"所有的集合类都不是同步的,但是你将会看到,在本章后面,我们可以获得同步版本。"

有人能告诉我在Java中同步和非同步集合之间的区别是什么吗?


http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html - Brian Roach
同步的是同步的。没有所谓的“非同步”。 - user207421
解决方案:https://dev59.com/DHNA5IYBdhLWcg3wHqCB - Rishabh Agarwal
我正在阅读有关Java中HashSet的内容,发现HashSet也是Java中的非同步类。 - Ali Hassan
5个回答

7

在同步中,如果我们正在执行某些操作,则需要等待其完成后才能转移到另一个任务。

默认情况下,集合类不会同步。集合对象是可变的,这意味着一旦创建了该对象并且该对象同时调用两个线程,但一个线程正在更改对象的值,则可能会受到另一个对象的影响。因此,它不是线程安全的。

我们可以使用静态方法java.util.Collections.synchronizedCollection(Collection<T> c)明确同步集合。


4

同步集合意味着该类是线程安全的。(你可以有非同步集合也是线程安全的,但这是另一个话题,需要写上一千篇论文才能说明。)

集合通过获取锁来同步修改,以确保其他线程不会破坏状态。

基本上,除非你有多个线程,否则使用非同步版本。

(如果你不知道,线程本质上是程序中的执行线路。一些程序有多个线程,共享相同的代码和内存。)


2

默认情况下,集合类不是同步的。但如果您想要同步的集合,可以使用静态方法 java.util.Collections.synchronizedCollection(Collection<T> c)。它将创建一个包装器,覆盖您的集合对象。因此,实际上,您的集合对象不会被同步,但您将通过包装器对象中的同步方法访问您的对象方法。


1
同步基本上意味着在任何给定时间内,只有一个线程可以访问该特定类的方法。StringBuffer是同步类的一个示例。同步类是线程安全的类。
非同步意味着在任何给定时间内,两个或更多线程可以访问该特定类的方法。StringBuilder是非同步类的一个示例。一般来说,非同步类不是线程安全的(但是一些非同步类是线程安全的)。

我并不认为仅仅因为一个类被同步化了就意味着它是线程安全的。参见:https://dev59.com/QWEh5IYBdhLWcg3w_nyv 对于没有同步化的类也是一样。 - entpnerd
Synchronized只是实现线程安全的一种基本方法。[https://dev59.com/DHNA5IYBdhLWcg3wHqCB#34261294] - Sahan Amarsha

0

非同步 - 它不是线程安全的,不能在多个线程之间共享,除非有适当的同步代码。 而同步 - 它是线程安全的,并且可以与许多线程共享。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接