2017-12-04 21 views
1

の呼び出し間で確実にどうすればいいですか?stack.isEmpty()stack.pop()スタックは別のスレッドからアクセスされませんか?スタックが空であるかどうか同時にチェックする

executor.submit(()->{ 
    File currentDirectory; 
    while(!directoryToSearch.isEmpty()) { 
     currentDirectory = directoryToSearch.pop(); 
     .... 
    } 
} 

ラッピング:tryおよびcatchブロックまたはすでに同期されたデータ構造のロックを作成する

while ((currentDirectory = directoryToSearch.pop()) != null) 

は、単純に良い解決策のように感じることはありません。

スタックは、その上にn個のスレッドを解放する前に埋められ、再び埋められません。私が見ている問題は、最後のオブジェクトでは、複数のスレッドがstack.isEmpty()チェックを渡して、スレッドの1つが他のすべてのスレッドの例外を発生させる1つの要素をポップする前にチェックすることです。

+0

キーワードを追加することで、常に関数を同期させることができます:public static synchronized int getCount() –

答えて

0

ConcurrentLinkedQueueを使用することをお勧めします。それは、同期化と将来のプルーフよりも速くなければなりません(DIDが後でスレッド内の項目を追加することを決定した場合、それを引き出しても機能します)。

第2の選択:例外をキャッチして、スタックが空であるかのように続行します。

同期化されたブロックに入るたびに同期にかなりのペナルティがありますが、例外が発生したときにスピードの問題が発生するだけです(これは面白いことは何もしません)。

例外はConcurrentLinkedQueueよりも少し速いかもしれませんが、ほんの少しです。

+0

現在、私はJeanが示唆しているようにsynchronizedメソッドを実装しましたが、この関数はファイルのインデックス付け私はできるだけ早くそれを保ちたいと思います。そのため、私は例外をキャッチして両方のアプローチがどれほど速いのかを比較しようとします。これまでのところ、私はいつも例外がスローされるかどうかにかかわらず、常にブロックを試してパフォーマンスを傷つけると思っていました。今日私は何か新しいことを学んだ。ありがとうございました。 – John

関連する問題