java.util.concurrent.ConcurrentSkipListSet的替代品

问题描述:

我正在寻找将一些使用java.util.concurrent.ConcurrentSkipListSet的代码移植到此类不可用的环境(特别是android 2.2)。因此,我正在寻找替代品。我的要求是:java.util.concurrent.ConcurrentSkipListSet的替代品

  • 基本的“设置”执行(不需要NavigableSet或类似)
  • 标准操作必须是线程安全的(我没有很高的呼叫量,所以锁定是可以接受的)
  • 迭代器不能抛出ConcurrentModificationException
  • 迭代器必须支持remove()操作

任何想法?

+0

您是否尝试过复制ConcurrentSkipListSet的源代码并查看它是否适用于Android 2.2?你有在那里工作的JDK5基础的concurreny类,对吗? – Thilo 2012-03-22 05:33:08

+0

这可能是可行的,但很可能是一些工作,因为ConcurrentSkipListSet似乎使用其他java.util.concurrent类的包私有方法。我不知道我最终会复制多少课。我希望有可以做这项工作的替代实现,但如果没有,我想这是最好的前进方向。 – Jules 2012-03-22 07:08:19

+0

虽然查看ConcurrentSkipListSet的源代码让我想起了之前我注意到的一些东西:HashSet的源代码(http://kickjava.com/src/java/util/HashSet.java.htm)非常简单,并且使用HashMap执行其所有工作。我想知道是否复制这个代替ConcurrentHashMap会做我想要的? – Jules 2012-03-22 08:03:29

a backport of java.util.concurrent for JDK 1.3 and above。它包括ConcurrentSkipListSet。试试看。您可能需要JDK 5的版本。

+0

有用。如果我在实施自己的解决方案之前看到它(根据原始问题的评论),我现在就会使用它! – Jules 2012-03-22 12:11:32

使用一个HashSet:

Set s = Collections.synchronizedSet(new HashSet(...)); 

同步S上,这应该是你没有被使用迭代remove()操作修改以任何方式设定比其他只要工作。

Collections.synchronizedSet

+0

这不会工作,因为我有一个线程迭代集合的内容,而另一个同时添加项目。 – Jules 2012-03-22 06:51:19

+0

但你说锁定是可以接受的! :p j/k。我认为你可以尝试Thilo的建议。 – Drew 2012-03-22 07:01:32