2016-09-29 2 views
1

私はマルチスレッドサービスでFastMap shared()を使用しています。場合によっては地図がクラッシュすることがあります。それはと表示されますが、私が要素を取得しようとすると、nullが得られます。私は常に最初の位置にある要素だけを取得し、その他の要素はnullです。私はvalue()を取得しようとしますが、1つの要素とsize > 1も取得します。FastMapサイズ> 0一つだけの要素

他のマップを使用していますか?サービスについて

:地図上の私は、ユーザーをソケットに接続し保持します。いくつかのスレッドはマップを読み書きできます。私はスレッドセーフマップが必要です。 FastMapはクラッシュするまで完璧に動作します。ランダムな時間にクラッシュします。それは1週間または1時間働くことができます。

+0

'Map'で' null'が見つかった場合は必ずしもエラーではありません。多くの 'Map'実装は' null'を扱うことができます。 – OldCurmudgeon

+0

私はsize()値4.を取得しますが、マップでは1つの要素しかありません。私はもう一つの要素を入れました。サイズは5ですが、要素は1つのみです。私は2つの要素を削除し、サイズ3を取得しますが、1つの要素を取得します。私は新しいFastMapを作成し、それは動作しますが、これは良くありません。私は地図を作り直すことができません – cezarius

+0

あなたは "クラッシュ"という言葉を言いますが、例外をスローすると思います。あなたが見ているすべての例外を提供してください。 – Gray

答えて

0

は時々クラッシュをマッピングします。それはサイズ> 1を示しますが、要素を取得しようとするとnullになります。

本当にこの質問に答えるには、問題の詳細を提供し、おそらくいくつかのコードサンプルを提供する必要があります。具体的には、あなたが見ている例外を提供する必要があります。

一つの可能​​性のある問題は、あなたがnew FastMap<Foo, Bar>().shared()を使用しているが、完全にあなたのコード内の競合状態からあなたを保護しないことを理解することが非常に重要であるということです。あなたは、次のようなものをやっている場合、それはあなたが見ているかを説明します:

// even though this shows stuff in the map 
if (map.size() > 0) { 
    // by the time we get here, it might have been removed so this throws 
    entry = map.entrySet().iterator().next(); 
} 

あなたのコードは、あなたがしているので、もし複数のスレッドが(私は仮定)を追加すると、マップから削除されている考慮する必要がありますマップ上で2つの操作を行うと、マップの状態が変更された可能性があります。

これが役に立ちます。質問に詳細を追加すると、より具体的なヘルプを提供できるはずです。

+0

あなたの例のようなユーザーマップはありません。私はalsmotは常にmap.values()を使用し、ユーザーmap.get(key)またはmap.replace(key、object)を使用することもあります。誤ったマップ値だけがエラーになることはありません。私はmap.shared()を使用します。クライアントがソケットに接続すると、新しいスレッドが作成されます。私は最初のコマンドを取得し、新しいクライアント情報オブジェクトを作成し、マップで置き換えてみます。鍵として、一意のクライアントIDを使用します。なぜなら、2つの接続を1つのクライアントに接続できないからです。 – cezarius

+0

私の例はまさにその例でした。あなたは、マップを複数回呼び出しているときには心配する必要があります。あなたが1を超える場合、レースコンディションは@cezariusに存在します。 – Gray

関連する問題