2012-03-22 21 views
1

java.util.concurrent.ConcurrentSkipListSetを使用するコードを、このクラスが利用できない環境(特にandroid 2.2)に移植することを検討しています。私はそれに代わるものを探しています。私の要件は次のとおりです。java.util.concurrent.ConcurrentSkipListSetの代替手段

  • 基本的な「SET」の実装(のNavigableSetまたは類似を必要としない)
  • 標準の操作は、スレッドセーフである必要があります(私は高いコールボリュームを持っていないので、ロックが許容される)
  • 反復子のremove()操作を

任意のアイデアをサポートしている必要がありますConcurrentModificationExceptionが

  • イテレータを投げてはいけませんか? sの上

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

    同期、これは限り、あなたはIteratorを使用して削除()操作以外の方法でセットを変更していないように動作するはずです:

  • +0

    ConcurrentSkipListSetのソースをコピーして、Android 2.2で動作するかどうか確認しましたか?あなたはそこで働いているコンコースのクラスのJDK5の基本を持っていますよね? – Thilo

    +0

    これは実行可能ですが、ConcurrentSkipListSetは他のjava.util.concurrentクラスのpackage-privateメソッドを使用しているようです。どのくらいのクラスをコピーしなければならないのか分かりません。私はそこに代替の実装があることを望んでいましたが、そうでない場合は、これが最善の方法だと思います。 – Jules

    +0

    ConcurrentSkipListSetのソースを見ると、以前気付いたことが思い出されましたが、HashSet(http://kickjava.com/src/java/util/HashSet.java.htm)のソースは非常に簡単で、 HashMapはすべての作業を実行します。私はこれをコピーし、ConcurrentHashMapを私が欲しいものにするかどうか疑問に思いますか? – Jules

    答えて

    2

    a backport of java.util.concurrent for JDK 1.3 and aboveがあります。これにはConcurrentSkipListSetが含まれます。試してみてください。おそらく、JDK 5のバージョンが必要です。

    +0

    便利です。私自身の解決策を実装する前にそれを見ていたら(元の質問に対するコメントに従って)私は今使っています! – Jules

    -1

    はHashSetのを使用してください。

    Collections.synchronizedSet

    +0

    他のスレッドが同時にアイテムを追加している間に、セットの内容を反復するスレッドが1つあるので、これは機能しません。 – Jules

    +0

    しかし、あなたはロックが容認されたと言った! :p j/k。私はあなたがその場合にThiloの推薦を試すかもしれないと思う。 – Drew