任何人都可以解释什么是不同步的& Java Collections Framework中的同步访问?
答案 0 :(得分:16)
同步与非同步访问与每次查看的Java集合框架无关。
同步访问意味着您有一些类型的锁定来访问数据。这可以通过使用synchronized
关键字或使用java.util.concurrent
包中的某些更高级别的结构来引入。
非同步访问意味着您在访问数据时不涉及任何锁定。
如果您在多个线程中使用集合,最好确保以同步方式访问它,或者集合本身是thread safe,即在内部处理此类锁定
要确保以同步方式访问某些集合coll
的所有访问权限,您可以
...使用synchronized (coll) { ... }
public void someMethod() {
synchronized (coll) {
// do work...
}
}
...使用Collections.synchronizedCollections
coll = Collections.synchronizedCollection(coll);
在前一种方法中,您需要确保synchronized
涵盖对集合的每次访问。在后一种方法中,您需要确保每个引用指向集合的同步版本。
正如@Fatal指出的那样,您应该理解后一种方法只将线程不安全集合转换为线程安全集合。这通常不足以确保你的类正在编写是线程安全的。有关示例,请参阅@Fatals注释。
答案 1 :(得分:5)
同步访问意味着它是thread-safe。因此,不同的线程可以同时访问集合而不会出现任何问题,但根据您的工作情况,它可能会慢一些。
非同步是相反的。不是线程安全的,但速度要快一点。
答案 2 :(得分:1)
Java Collection Framework中的同步访问通常通过使用Collections.synchronizedCollection(...)
等进行包装来完成,并且只能通过此包装器进行访问。
有些例外情况已经同步,例如Hashtable
和Vector
。
但请记住: 同步是在集合实例本身上完成的,并且具有每个方法调用的作用域。因此后续调用可能会被另一个线程中断。
实施例:
您首先调用isEmtpy()
方法获取不为空的结果,之后您要从该集合中检索元素。但是第二个方法调用可能会失败,因为由于您的调用之间的另一个线程的操作,集合现在可能为空。
因此,即使使用同步集合,您也需要关注同步,并且可能需要在集合外部同步自己!