谁能解释一下Java集合框架中的非同步和同步访问是什么?
发布于 2011-06-21 17:21:45
同步访问与非同步访问不一定与Java集合框架有关。
同步访问意味着您拥有某种类型的锁定来访问数据。这可以通过使用synchronized关键字或使用java.util.concurrent包中的一些更高级别的构造来引入。
非同步访问意味着在访问数据时不涉及任何锁定。
如果你在多个线程中使用一个集合,你最好确保以同步的方式访问它,或者确保集合本身是thread safe的,即在内部处理这样的锁定。
要确保以同步方式访问对某个集合coll的所有访问,您可以
使用synchronized (coll) { ... }访问
public void someMethod() { synchronized (coll) { //做工作...}使用Collections.synchronizedCollections }
coll = Collections.synchronizedCollection(coll);
在前一种方法中,您需要确保synchronized覆盖了对集合的每次访问。在后一种方法中,您需要确保每个引用都指向集合的同步版本。
然而,正如@Fatal所指出的,您应该理解后一种方法只是将线程不安全的集合转换为线程安全的集合。这通常不足以确保您正在编写的类是线程安全的。有关示例,请参阅@Fatals注释。
发布于 2011-06-21 17:14:34
同步访问意味着它是thread-safe。因此,不同的线程可以同时访问集合,没有任何问题,但它可能会稍微慢一点,这取决于您正在做什么。
不同步是相反的。不是线程安全的,但速度要快一点。
发布于 2011-06-21 17:25:38
Java Collection Framework中的同步访问通常是通过Collections.synchronizedCollection(...)等封装来完成的,并且只能通过此包装器进行访问。
有一些例外已经同步了,比如Hashtable和Vector。
但请记住:同步是通过集合实例本身完成的,并且每个方法调用都有一个作用域。因此,后续调用可能会被另一个线程中断。
示例:首先调用isEmtpy()方法,得到它不为空的结果,然后想要从该集合中检索一个元素。但是第二个方法调用可能会失败,因为由于调用之间另一个线程的操作,集合现在可能是空的。
因此,即使使用同步的集合,您也必须关心同步,并且可能有必要在集合之外同步自己!
https://stackoverflow.com/questions/6422887
复制相似问题