同期配列リストの競合状態

Anitha.R:

私は同期ブロック内のオブジェクトのリストの処理を囲みますが、競合状態で終わっています。私は誤って同期ブロックを使用するか、私のコードを持つ他の問題があるだろうか?リストは、実際て、mapdbでインスタンス化されます。

private static List<MessageHolder> msgHolders;
//messageSequenceDB instantiation
msgHolders = (List<MessageHolder>) messageSequenceDB.indexTreeList("tempStorage", Serializer.JAVA).createOrOpen();


synchronized (msgHolders) {
        System.out.println(Thread.currentThread().getName() +"->"+msgHolders.toString());
        for (MessageHolder holder : msgHolders) {
            if(holder.getStatus().equalsIgnoreCase(STATUS_INITIAL) {
                holder.setStatus(STATUS_DISPATCHED);
                LOGGER.info("MESSAGE SEQUENCER: Message {} dispatched", holder);
                //Remaining code
}}}

私はただ一つのスレッドによって処理される1つのオブジェクトを期待しています。第二のスレッドがそれを派遣しようとした場合、ステータスに関する条件は失敗しなければなりません。、いくつかのメッセージは、すべてのスレッドで処理されるが、私は出力を取得しています。

ここにサンプル出力を提供します。

pool-12-thread-1->[MessageHolder [key=TradeId.1, message=1, status=Initial], MessageHolder [key=TradeId.2, message=222, status=Initial]]

pool-12-thread-2->[MessageHolder [key=TradeId.2, message=222, status=Initial], MessageHolder [key=TradeId.1, message=1111, status=Initial]]

pool-12-thread-3->[MessageHolder [key=TradeId.2, message=222, status=Initial]]

pool-12-thread-1->[MessageHolder [key=TradeId.1, message=11, status=Initial]]

ID 222のメッセージは、すべての3つのスレッドによって処理されます。私は、同期を確保するために何をすべきでしょうか?

Anitha.R:

私は揮発性として、フィールドの状態を作ることによって、これを解決してきました。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=219967&siteId=1