1

LinkedListに非常に特殊な並べ替えを行おうとしています。ListIteratorを使用して、アイテムを追加したい場所を見つけます。これは静かに機能します。唯一の問題は、アイテムを追加およびソートしたい複数のスレッドがあることです。追加自体は同期されますが、LinkedListは不揮発性プロパティを使用します。それは安全ではありませんね?これが私がやろうとしていることです(簡略化):

public class Test {
    private LinkedList<Long> list = new LinkedList<Long>();

    synchronized void add ( final long number ) {
        // iterate our sorting list
        final ListIterator<Long> iterator = list.listIterator( list.size() );
        while (iterator.hasPrevious()) {
            long current = iterator.previous();
            if (current < number) {
                if (iteratot.nextIndex() >= list.size()) {
                    list.add( number ); // I don't need the iterator anymore
                } else {
                    iterator.next();
                    iterator.add( number );
                }
            }
            // This here gets difficult 
            // I need the current number here! (which is the one that is a little lower than the added one)
        }
    }
}

上記のソースは、私が行っていることに似ているだけで、元のソースよりもはるかに単純です。

スレッドセーフな、または私が知らない別の解決策である、私が見たことがない別のリストタイプはありますか?

4

2 に答える 2

3

Test.listアクセスして変更する唯一の方法がを介する限りTest.add()、コードはスレッドセーフです。

アクセス/変更する他の方法がある場合はTest.list、詳細をお知らせください。

于 2013-01-19T13:51:21.967 に答える
0

あなたはsynchronizedListメソッドを見ることができます。

指定されたリストに基づく同期(スレッドセーフ)リストを返します。シリアルアクセスを保証するために、バッキングリストへのすべてのアクセスが返されたリストを介して行われることが重要です。

于 2013-01-19T13:51:42.160 に答える