concurrentskiplistset内部工作,与treeset的区别

zzwlnbp8  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(412)

我所理解的唯一区别是迭代器之间的区别。 SkipList 具有弱一致性,而 TreeSet 很快就失败了。除此之外,我没有看到任何同步的方法在里面 SkipList (尽管它在并发包中)。
有人能给我解释一下情况吗 SkipList 当它没有任何同步的时候是并发的吗?它能帮助我解决哪些问题?除了迭代器之间的差异之外,我为什么还要使用它呢?

jfgube3f

jfgube3f1#

“当skiplist中没有任何同步时,它是如何并发的?”
热释光;博士- ConcurrentSkipListSet 是并发的,因为它所持有的元素不能通过并发执行线程同时写入。它不需要使用 synchronized 还有锁。
长版
在并发集合的上下文中,并发并不一定意味着这些类都使用监视器实现线程安全(aka synchronized 关键字)。
首先,您应该了解线程安全本质上是确保两个或多个相互竞争的线程不会修改应用程序的共享状态。然后你就会意识到,除了 synchronized 以实现线程安全。
首先确保你的状态不能被修改(它是不可变的),这是获得线程安全的一个简单但非常有效的方法。
另外,类可以通过将其线程安全职责委托给不同的线程安全类来实现线程安全。 ConcurrentSkipListSet 被认为是并发的,因为正如javadoc所说,它的“插入、删除、更新和访问操作由多个线程安全地并发执行”。
它实现了并发性,因为它将其线程安全职责委托给线程安全类;即: ConcurrentSkipListMap . ConcurrentSkipListSet 线程安全是因为 ConcurrentSkipListMap 是。以及 ConcurrentSkipListMap 是线程安全的,因为 AbstractMap.SimpleImmutableEntry<K,V> 在内部,它保证当前执行的线程不能修改它的状态(键和值),因为它的状态是不可变的。
你可以看到 ConcurrentSkipListSet 授权给 ConcurrentSkipListMap 在我上面链接的源代码的几个地方。如果您想了解更多关于委派线程安全的知识,我建议您阅读第4章,组合对象,java并发实践。
“它能帮我解决什么问题”
使用它可以让你自由线程安全。这种方式是更有效的方式-和方式射击自己的脚-比使用 synchronized .
····除了迭代器之间的差异之外,我为什么还要使用它呢
如果应用程序的状态需要存储在某个集合中,并且该集合可以以任何方式被并发执行的线程访问,那么使用 ConcurrentSkipListSet 是一个线程安全的选项。

相关问题