2013-08-08 15 views
10

DirectoryStreamのドキュメントは明確に述べて:反復処理DirectoryStreamと同時に、ディレクトリの内容を変更

イテレータが弱一貫性です。スレッドセーフですが、反復処理中に がディレクトリをフリーズしないため、 が作成された後にディレクトリに の更新が反映される(または反映されない)可能性があります。

私のマシンでは、デバッグモードのディレクトリで単純な反復処理を実行しました。反復が完了する前に、私は実行を破って、反復されるディレクトリにファイルを追加して再開しました。繰り返しは、追加ファイルを見ませんでした。

私の質問:どのような状況の下でこれはディレクトリ内容の更新を反映していますか? 残念なことに、正式な文書はそれについて非常に曖昧です。最小限にする。

+2

わかりませんが、私はそれを読んだり、それは非決定論的であり、根底にあるOS/FSや特定の実装に依存している可能性があります。私の推測では、イテレータが指している現在のディレクトリよりもツリーの後ろにあるinodeにディレクトリがある場合は、更新が反映されます。 この現象を引き起こす方法私は知らない。私は、純粋なJavaを使用して(決定論的な方法で)即座に可能ではないと言うことに自信を持っています。 –

答えて

4

文書は意図的に曖昧です。 JVMは、さまざまな種類のマシン(WindowsとUnix派生)で動作する必要があります。ファイルシステムによって、動作が異なります。プログラムを複数のコンピュータで確実に動作させるには、最悪の場合の設計が必要です(繰り返してください)。

スナップショットを取得する(またはスナップショットに非常に近い)ために、DirectoryStream全体をスラッシュアップし、スナップショットを反復処理してから、ストリームを再スラップさせることをお勧めします。スナップショットの異なるバージョンを比較して、基礎となるディレクトリの変更を判断できます。

+0

私は結論に完全に同意した、問題は学問的な関心からではなかった。 – Vitaliy

2

DirectoryStreamはインターフェイスであり、NIO.2のこの部分はプラグイン可能とするため、LinuxおよびWindows用のJDKに付属する実装には考慮しないでください。その振る舞いを持つカスタム実装を書くことや、クラスター化された実装や分散された実装では、その動作を副作用として持つことが可能です。

ドキュメントは、意図的に曖昧であり、POSIXはalso intentionally vagueあるreaddirに代表をその下に:ファイルがopendirなどしてから削除したり、最新のコールの後にディレクトリに追加されている場合は

()またはrewinddir( )、それ以降のreaddir_r()の呼び出しでそのファイルのエントリが返されるかどうかは不定です。

あなたは実装がそのあいまいさに依存していたコンクリートの場合後にしている場合は、その後、Linux ext3 readdir and concurrent updatesrsyncは、高容量でext3ファイルシステムに、ファイルが外部のディレクトリに表示されように思われた場合を示しています

関連する問題