2017-08-08 2 views
1

Collections.synchronizedList()の実装を正しく使用する方法がわかりません。Collections.synchronizedListとの連携を修正しました

私は、これら二つのき:

public synchronized static List<CurrencyBox> getOrderList() { 
     return Collections.synchronizedList(orderList); 
    } 

public static List<CurrencyBox> getOrderList() { 
     return Collections.synchronizedList(orderList); 
    } 

だから、私の知る限り理解されるように、synchronizedListは本当に正しい、オーダーリストではなくコピーを返しますか?

だから、上記の実装のどれが追加と削除のような原子操作を忠実にしたいのですか?

そしてJava9では何か変わることがありますか?それともまだ別の提案がありますか?

は、それはあなたがアトミック操作を保証与えないどちらを提供スニペットから、言うには少し難しい状況がなければ、あなた

+0

'getOrderList()'を呼び出すときに、新しい同期リストを作成する理由はありますか?私はイニシャライザブロックでそのインスタンスを作成し(ソースリストと共に)、このメソッドでそのインスタンスを返します。そうすれば、その方法を同期させるかどうかは関係ありません。 – Tom

+0

私は、 'orderList = Collections.synchronizedList(new ArrayList <>());'または 'setOrderList(List <> newList){orderList = Collections.synchronizedList(newList);}のように初期化子で期待しています。 } ' – daniu

答えて

2

ありがとうございます。

ドキュメントの状態:

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

ですから、メソッドを同期させる場合でも、あなたが買ってあげる最高には2つのオブジェクトが同時に同期リストを作成していないことを保証するものです。

orderListCollections.synchronizedListとラップして、その都度保存した結果を返す必要があります。

private static List<CurrencyBox> orderList = Collections.synchronizedList(new ArrayList<CurrencyBox>()); 
public static List<CurrencyBox> getOrderList() { 
    return orderList 
} 
2

同期リストはこのリストの同期メソッドのみです。

これは、別のスレッドが現在このリストのメソッドを実行中に、スレッドがリストを変更できないことを意味します。オブジェクトはメソッドの処理中にロックされます。一例として、

、の2つのスレッドがパラメータとして2つの異なるリスト(A=A1,A2,A3B=B1,B2,B3)で、あなたのリスト上addAllを実行するとしましょう。

  • メソッドが同期されると、あなたはこれらのリストは、あなたが決めていないA1,B1,A2,A3,B2,B3

  • のようにランダムにマージされませんを確認することができたときに、他のスレッドにスレッドハンドオーバプロセスすることができますので、 A1,A2,A3,B1,B2,B3またはB1,B2,B3,A1,A2,A3のいずれかを取得します。

クレジット:jhamon

関連する問題