【问题标题】:Difference between Collections.synchronizedMap() and synchronizedCollections.synchronizedMap() 和同步之间的区别
【发布时间】:2014-04-27 03:03:15
【问题描述】:

如果我创建地图

Map map=new HashMap(40,.75f);

通过以下两种不同的方式同步它

Collections.synchronizedMap(map) :- which is internally using mutex
synchronized(map){}

以上两种方法有什么区别。

【问题讨论】:

  • 这是 Java 吗?如果是这样,也许添加一个语言标签

标签: java collections synchronized


【解决方案1】:
Collections.synchronizedMap(map) :- which is internally using mutex
synchronized(map){}

以上两种方法有什么区别。

不同之处在于Collections.synchronizedMap(map) 通过将地图包装在同步对象中来为您进行同步。如果您查看Collections 类的Java 源代码,您应该会看到SynchronizedMap 对象。在那里它做了类似的事情:

final Object      mutex;        // Object on which to synchronize
...
public int size() {
   synchronized (mutex) {return m.size();}
}

所以在内部它的作用与在外部调用synchronized 相同。但是,这需要您手动进行猜测和编程。它使您免于丢失和不保护重要的方法调用或将您的 Map 传递给另一个不能正确同步它的库或其他东西。

还有第三个选项可能更好,那就是使用ConcurrentHashMap。这是一个从头开始编写的哈希映射,以允许多个线程并行对其进行操作。它将提供比您提到的两个选项更好的性能。

【讨论】:

    【解决方案2】:

    同步对象确保一次只有一个线程可以使用该对象。

    http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

    【讨论】:

    • 但我不明白如果我使用 synchronized(map) 只有一个线程可以访问它。那么为什么要使用 Collections.synchronized(map)。我不明白,我想知道两者工作方式相同或不同
    • Collections.synchroinzedMap(map)synchronized(map){} 的快捷方式。它们的行为相同。
    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 2012-02-11
    • 2015-07-25
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 2014-10-04
    • 2010-10-05
    相关资源
    最近更新 更多