8

私が知っていて調査したところによるとsynchronized、Javaのキーワードを使用すると、メソッドまたはコードブロックステートメントを同期して、マルチスレッドアクセスを処理できます。マルチスレッド環境で書き込み目的でファイルをロックする場合は、 JavaNIOパッケージのクラスを使用して最良の結果を得る必要があります。昨日、ファイルI / O操作用の共有サーブレットの処理について質問がありました。BalusCのコメントは解決策に役立ちますが、この回答のコードは私を混乱させます。私はコミュニティに「その投稿を焼き付ける」または「彼に反対票を投じましょう」と尋ねているのではありません(注:私はそれなどに反対票を投じていません、そして答えに反対するものは何もありません)、コードフラグメントができるかどうか説明を求めています良い習慣と見なされる

private static File theFile = new File("theonetoopen.txt");

private void someImportantIOMethod(Object stuff){
    /*
        This is the line that confuses me. You can use any object as a lock, but
        is good to use a File object for this purpose?
    */
    synchronized(theFile) {
        //Your file output writing code here.
    }
}
4

4 に答える 4

4

問題は、Fileオブジェクトをロックすることではありません。任意のオブジェクトをロックできますが、実際には重要ではありません(ある程度)。

私が驚いたのは、非ファイナルモニターを使用しているため、コードの別の部分でFile:が再割り当てされた場合theFile = new File();、次のスレッドが別のオブジェクトでロックされ、コードがロックされないという保証はありません。もう2つのスレッドによって同時に実行されます。

最終theFile的なものであれば、コードは問題ありませんが、他のロック目的でそれを使用する別のコードがないことを確認するために、プライベートモニターを使用することをお勧めします。

于 2012-08-15T19:55:43.110 に答える
2

単一のアプリケーション内でファイルをロックするだけでよい場合は、問題ありません(final追加されていると仮定します)。

異なるクラスローダーを使用してクラスを複数回ロードすると、ソリューションは機能しないことに注意してください。たとえば、同じWebサーバーに2回デプロイされたWebアプリケーションがある場合、アプリケーションの各インスタンスには独自のロックオブジェクトがあります。

おっしゃるように、ロックを堅牢にし、他のプログラムからもファイルをロックしたい場合は、FileLockを使用する必要があります(ドキュメントを参照してください。一部のシステムでは、すべてのプログラムがロックを尊重する必要があるとは限りません)。

于 2012-08-15T20:21:56.863 に答える
1

あなたは見ましたか:final Object lock = new Object()あなたは尋ねますか?
@assyliasが指摘したように、問題はロックがfinalここにないことです

于 2012-08-15T19:57:10.163 に答える
1

Javaのすべてのオブジェクトは、同期のロックとして機能できます。それらは固有のロックと呼ばれます。特定のロックによって保護されたコードのブロックを実行できるのは、一度に1つのスレッドだけです。

詳細:http ://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

メソッド全体にsynchronizedキーワードを使用すると、アプリケーションのパフォーマンスに影響を与える可能性があります。そのため、同期ブロックを使用できる場合があります。

ロック参照は変更できないことに注意してください。最善の解決策は、finalキーワードを使用することです。

于 2012-08-15T20:07:56.403 に答える