我刚刚在Java 6 API上看到了这个数据结构,我很好奇它何时会成为一个有用的资源。我正在为scjp考试而学习,尽管我已经看过提及它的模拟考题,但我没有看到它在凯西塞拉利斯的书上。什么时候ConcurrentSkipListSet有用?
回答
ConcurrentSkipListSet和ConcurrentSkipListMap在您需要一个可以被多个线程访问的排序容器时非常有用。这些实质上是并发代码的TreeMap和TreeSet的等价物。
JDK 6的实现基于Maged Michael在IBM的High Performance Dynamic Lock-Free Hash Tables and List-Based Sets,它表明您可以使用compare and swap (CAS)操作以原子方式在跳过列表上执行大量操作。这些都是无锁的,因此当您使用这些类时,您不必担心(对于大多数操作)的开销。
目前没有基于Red-Black tree的基于Java的并发Map/Set实现。我仔细查看了一下文献,发现一个couplepapers表明并发RB树性能优于跳过列表,但是这些测试中有很多是用transactional memory完成的,目前在任何主要体系结构的硬件上都不支持这些测试。
我假设JDK家伙在这里使用了一个跳过列表,因为实现是众所周知的,因为它使得它无锁是简单和便携的(使用CAS)。如果有人关心澄清,请做。我很好奇。
跳过列表是排序列表,并有效地用log(n)性能进行修改。在这方面它就像TreeSet。但是没有ConcurrentTreeSet。我听到的是跳过列表很容易实现,这可能是为什么。
无论如何,当你需要一个并发的,分类高效的设置,你可以使用ConcurrentSkipListSet
这些,当你需要一组可以安全地被多个线程同时访问是有用的。它还通过弱一致性提供了良好的性能 - 在遍历Set时插入可以安全地进行,但不能保证您的Iterator将看到该插入。
ConcurrentSkipListMap是我需要为本地缓存实现复制层时的一个奇妙发现。 Map方面实现了缓存,而List方面让我跟踪对象在缓存中出现的顺序。该列表的“跳过”方面使得从列表中的一个位置移除一个对象并在缓存中替换它时将其对齐到最终效率。
- 1. 什么时候__proto__有用?
- 2. 什么时候File.join有用?
- 3. 什么时候应该使用AWS,什么时候不使用
- 4. intn_t什么时候使用它,什么时候不使用
- 5. 什么时候使用__proto__和什么时候使用原型
- 6. 什么时候使用Ruby和什么时候使用PHP
- 7. 什么时候创建了app.config,什么时候app.exe.config和有什么区别
- 8. 什么时候HTTP 404有用,什么时候应该考虑503?
- 9. 什么时候使用GWT,什么时候不需要
- 10. ZF2什么时候使用getServiceLocator()什么时候不到
- 11. SQL Server CASE什么时候不使用CASE什么时候
- 12. 变量变量:什么时候有用?
- 13. 什么时候循环有用?
- 14. dynamic_cast <void*>什么时候有用?
- 15. 什么时候ASP.NET Expression Builders最有用?
- 16. 什么时候是SqlConnection.RetrieveStatistics()有用?
- 17. 什么时候调用setDataTimeout?
- 18. 什么时候使用uncaught_exception?
- 19. 什么时候用短?
- 20. 什么时候调用webview.clearData
- 21. 什么时候DataView可用?
- 22. 什么时候使用vtable?
- 23. 什么时候调用robot.cleanUp()
- 24. 什么时候使用sIFR?
- 25. JOINS什么时候使用?
- 26. 什么时候使用Dispose
- 27. 什么时候使用ANTLR
- 28. 什么时候使用StringIO?
- 29. Railties - 什么时候使用
- 30. 什么时候调用onSizeChanged()?
如果要以高性能方式跟踪多线程环境中的唯一记录,这也很有用。 – anataliocs 2017-03-06 22:47:21