2013-01-19 87 views
1

我想對LinkedList做一個非常特殊的排序。我使用ListIterator來查找我想要添加項目的位置,並且工作安靜。唯一的問題是我有多個想要添加和排序項目的線程。添加本身是同步的,但LinkedList使用非易失性屬性。這不安全,是嗎?這是我想要做的(簡化):Java易變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) 
     } 
    } 
} 

上面的來源只是類似於我在做什麼,是更簡單的,原來的。

是否有另一個列表類型我沒有看到哪個線程安全或另一個解決方案,我只是不知道?

回答

3

只要通過Test.add()訪問和修改Test.list的唯一方法是,您的代碼就是線程安全的。

如果還有其他方法可以訪問/修改Test.list,您需要告訴我們更多。

+0

我唯一的想法是因爲LinkedList的屬性不是不穩定的。這沒有問題呢? – Nemo64

+1

如果您正在使用同步它建立之前發生的關係,所以它是線程安全的IMO –

0

您可以看到synchronizedList方法。

返回由指定列表支持的同步(線程安全)列表。爲了保證串行訪問,通過返回列表完成對後備列表的所有訪問至關重要。

+1

SynchronList唯一做的事是同步我正在做的訪問與我的方法,所以它是毫無意義的。 – Nemo64