Windowsでは、未開封ファイルに次のJavaコードの保証と排他的ロックを行いますか?

StackOverflow https://stackoverflow.com/questions/3203073

質問

次のJavaコードは、Windowsの未開封ファイルの排他ロックを保証しますか?

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {
    public static void main(String[] args) {
        File file = new File("mylog.log");
        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.getChannel().lock();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
.

役に立ちましたか?

解決

Java Specsで見られるように:

Java仮想マシン全体に代わってファイルロックを保持します。それらは、同じ仮想マシン内の複数のスレッドによるファイルへのアクセスを制御するのには適していません。

だからスレッドの専用ロックを必要とする場合は、別の方法を選択してください。

他のヒント

tl; DR:いいえあなたは、ホストオペレーティングシステムのあなたのロックの扱いの動作についての仮定をすることはできません。

良いニュース:あなたはあなたのアプリケーション内にスレッドセーフロックメカニズムを持っていることを確認しようとしていますか?もしそうであれば、FileLockで十分である(もちろん、他のアプリケーションが正しく書き込まれたスレッドセーフなコードで構成されていると仮定して)。

悪いニュース:残念ながら、Windowsがすべてのアプリケーションでロックを尊重することを確認しようとしている場合は、それをカウントすることはできません。

これはWindowsでも遵守するのが簡単です。に書かれているファイルを上書きすることができます(ログファイルが長すぎる場合は、Emacsが以前のすべてのスパムを切り刻んだ場合)。そうは言っても、Windowsは通常オープンファイルを削除することはできません。

FileLockのドキュメンテーション

ファイルロックは Java仮想マシン全体。彼らです アクセス制御には適していません の中の複数のスレッドによるファイル 同じ仮想マシン。

ファイルロックオブジェクトは使用できない 複数の同時スレッド。

...以降...

実際にロックかどうか 他のプログラムを防止します ロックされたコンテンツへのアクセス 地域はシステム依存です したがって、指定されていない。ネイティブ いくつかのファイルロック施設 システムは単に勧められ、意味です そのプログラムは協力しなければならない 既知のロッキングプロトコルを観察してください データの整合性を保証するために注文してください。オン 他のシステムネイティブファイルロック 必須で、一つのプログラムの場合 その他のファイルの領域をロックします プログラムは実際には予防されています その地域へのアクセスにアクセスする ロックに違反します。もうすぐです システム、ネイティブファイルがロックされているかどうか アドバイザリーや必須が設定可能です ファイルごとに。確実に 一貫した正しい行動を超えています プラットフォーム、それは強くお勧めします このAPIによって提供されるロック あたかも彼らが諮問ロックされていたかのように使用されます。

ファイルのロックとロック解除フラグを使用していても、Javaアプリケーション内にexclusive lock があることを保証するだけです。

Windowsファイルの排他ロックを保証するようにWindowsを呼び出すために、JNI、または別のコンピュータの言語を使用する必要があります。

Windows lockfile 関数

Windows unlockfile 関数

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top