关于不同步& Java Collections Framework中的同步访问?

时间:2011-06-21 09:10:09

标签: java

任何人都可以解释什么是不同步的& Java Collections Framework中的同步访问?

3 个答案:

答案 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(...)等进行包装来完成,并且只能通过此包装器进行访问。

有些例外情况已经同步,例如HashtableVector

但请记住: 同步是在集合实例本身上完成的,并且具有每个方法调用的作用域。因此后续调用可能会被另一个线程中断。

实施例: 您首先调用isEmtpy()方法获取不为空的结果,之后您要从该集合中检索元素。但是第二个方法调用可能会失败,因为由于您的调用之间的另一个线程的操作,集合现在可能为空。

因此,即使使用同步集合,您也需要关注同步,并且可能需要在集合外部同步自己!