关于 Java Collections Framework 中的非同步和同步访问?

新手上路,请多包涵

谁能解释什么是 Java 集合框架中的非同步和同步访问?

原文由 unknownsatan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 627
2 个回答

同步与非同步访问与 Java Collections Framework 无关。

同步访问意味着您有 某种锁定 来访问数据。这可以通过使用 synchronized 关键字或通过使用 java.util.concurrent 包中的一些更高级别的构造来引入。

非同步访问意味着您在访问数据时 涉及任何锁定。

如果您在多个线程中使用集合,您最好确保以同步方式访问它,或者集合本身是 线程安全 的,即在内部处理此类锁定。

为了确保以同步方式访问对某些集合的所有访问 coll ,您可以

  • …环绕访问 synchronized (coll) { ... }
   public void someMethod() {
      synchronized (coll) {
           // do work...
      }
  }

  coll = Collections.synchronizedCollection(coll);

在前一种方法中,您需要确保对集合的 每次访问 都包含在 synchronized 中。在后一种方法中,您需要确保 每个引用都 指向集合的同步版本。

然而,正如@Fatal 所指出的,您应该了解后一种方法只会将线程不安全集合转换为线程安全集合。这通常不足以确保 正在编写的类是线程安全的。有关示例,请参阅@Fatals 评论。

原文由 aioobe 发布,翻译遵循 CC BY-SA 3.0 许可协议

同步访问意味着它是 线程安全的。因此,不同的线程可以同时访问集合而不会出现任何问题,但根据您的操作,它可能会慢一点。

不同步则相反。不是线程安全的,但速度要快一点。

原文由 Christian 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏