2011-12-01 188 views
1

在Java中是否有线程安全的树实现?我发现了一些建议在add和remove方法中使用synchronized()的信息,但我有兴趣查看是否有内置于Java的东西。线程安全树

编辑:我正在尝试使用Octree。我只是在学习,但我正在使用这个项目来学习多线程和空间索引,因此我在这里有很多新的主题。如果有人有一些特别好的参考资料,请分享。

+2

...反对使用java.util.concurrent。*容器作为基础?什么会使“树”不是线程安全的? – BRFennPocock

+0

什么样的树,为了什么目的? B树,红黑树等? –

+1

@BRPocock:同样的事情会使任何其他数据结构非线程安全:对其状态进行非同步的非原子并发更新。 –

回答

4

documentation for TreeMap

SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...)); 

注意,这不仅使同步每次调用。在很多情况下,这对于应用程序而言是错误的粒度,并且您最好在更高级别进行同步。请参阅docs for synchronizedSortedMap

0

您可以使用Collections.synchronizedSet()synchronizedMap()围绕各个方法添加同步,但是线程安全并不是数据结构的属性,而是应用程序的真正属性。如果遍历树,或者执行一系列需要原子操作的操作,则包装将不够用。

0

A java.util.concurrent.ConcurrentSkipListMap可能是感兴趣的。这对大多数用途来说都是过分的,但如果你需要细粒度的同步,那就没有什么比这更好的了。过度杀伤击败。当然,这不是一棵树,而是做同样的工作。我不相信你可以在真正的树中获得低级别的同步。

+0

但是还有一个等价的java.util.concurrent.concurrentSkipListSet也可用。这是完美的这种情况。比使用SyncronizedSet()更有效。 – Linus