TreeMap - 同步文档说明

TreeMap - Synchronization Documentation Explanation

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

注意这个实现是不同步的。

如果多个线程并发访问一个map,并且至少有一个线程在结构上修改了map,则必须进行外部同步。 (结构修改是添加或删除一个或多个映射的任何操作;仅更改与现有键关联的值不是结构修改。)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.

Does it means to create a lock and move the map modification logic into a synchronized block or something else all together. Will only the structural modification requires synchronization and accessing is thread safe.

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

最后,如果多个线程并发访问map,并且至少有一个线程修改了map结构,那么所有对map的访问应该是同步的。

基本上,Javadoc 相当混乱,因为如果您完全修改映射(包括当您只是更改与现有键相关联的值时),几乎在所有情况下您都希望同步所有操作。 (几乎)唯一不需要同步的情况是地图在发布后完全只读。

现在,为什么 Javadoc 说 If ... at least one of the threads modifies the map structurally - 这是因为如果您只是更改与现有键关联的值,那么可能发生的最糟糕的事情是您在某个未指定的时间内读取过时值.相反,如果在没有同步的情况下进行结构更改,那么可能会发生更糟糕的事情(例如 NullPointerExceptions,无限循环)。

然而,同步或使用并发集合几乎总是比允许陈旧值更好。