0

複数のスレッドが同じファイルを変更しようとする可能性があるアプリケーションを作成しています。これを克服するために、ファイル名を同時ハッシュマップ filename<->count に保存し、wait と notify を使用することを考えました。

if(map has fileName){
 map.put(fileName, map.get(fileName)++ )
 wait()
}else{
 map.put(fileName,1)
}

modifyFile(fileName);

{
 count = map.get(fileName);
 if count == 1 then map.remove(fileName)
 else map.put(fileName, count-- )
 notify()
}

しかし、上記のコードはエレガントだとは思いません。これを行うより良い方法はありますか?
編集:単純なロックは、すべてのスレッドのフローをブロックします。同じファイルを変更したいスレッドをブロックしたいだけで、他のスレッドは影響を受けないはずです

4

1 に答える 1

2

あなたのコードは実際にはスレッドセーフではありません。マップからオブジェクトを削除する前に、複数のスレッドがif count == 1同時にチェックに合格する可能性があります。

java.util.concurrent

より適切に機能する Semaphore 実装が含まれています。次に、ハッシュマップを使用してセマフォを格納します。セマフォを追加/削除しないでください。アクセスするだけです。次に、マップではなく、セマフォによって同期作業が行われます。

modifyFile(fileName);
{
 semaphore = map.get(fileName);
 semaphore.acquire(1);
 doWork();
 semaphore.release(1);
}
于 2013-06-10T19:10:02.880 に答える