TreeMap - 同步文档说明

时间:2017-05-02 15:22:45

标签: java javadoc

TreeMap javadoc有以下部分,我无法理解下面部分的最后一行。这是否意味着创建一个锁并将地图修改逻辑移动到同步块或其他所有内容中。只有结构修改才需要同步,访问是线程安全的。

请注意,此实施未同步。

如果多个线程同时访问映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。 (结构修改是添加或删除一个或多个映射的任何操作;仅更改与现有键关联的值不是结构修改。)This is typically accomplished by synchronizing on some object that naturally encapsulates the map. If no such object exists, the map should be "wrapped" using the Collections.synchronizedSortedMap method.

2 个答案:

答案 0 :(得分:2)

基本上,Javadoc相当令人困惑,因为如果你根本修改了地图(包括当你只是改变与现有密钥相关的值时),你想要在几乎所有情况下同步所有操作。 (几乎)只有你不需要同步的时间是地图在发布后是完全只读的。

现在,为什么Javadoc会说If ... at least one of the threads modifies the map structurally - 因为如果你只是改变与现有密钥相关的值,那么可能发生的最糟糕的事情就是你为某些人读取了陈旧的价值未指明的时间。相反,如果在没有同步的情况下进行结构更改,那么可能会发生更糟糕的事情(例如NullPointerException s,无限循环)。

然而,同步或使用并发集合而不是允许过时值几乎总是更好。

答案 1 :(得分:1)

  

是否意味着创建锁并移动地图修改逻辑   一起进入同步块或其他东西。   只有结构修改才需要同步和   访问是线程安全的。

不够。仅仅同步进行结构修改的处理是不够的,因为如果读取映射的方法不同步,则可以使用synchronized方法同时调用该方法。因此,对Map的访问可以与读取操作和结构修改操作同时进行。这是不可取的。

最后,这意味着如果多个线程同时访问地图,则应同步对地图的所有访问,并且至少有一个线程修改地图结构。

相关问题