私はこのクラスを持っています。これは、ファイル ロック ユーティリティへの基本的なアプローチです (OS からのロックとは相互作用しません)。アイデアは、バイナリ セマフォでアプリケーションによって使用される File オブジェクトへの参照のペアを格納する静的な HashMap を持つことです。新しいファイルに最初にアクセスすると、ペアが変数に格納されます。問題は、.wait() 行が IllegalMonitorStateException をスローすることです。なぜなら、このクラスを 1 つのスレッドだけでテストするプロジェクトを作成したため、メソッドにアクセスするスレッドが所有していないということはあり得ないからです。オブジェクトですね。
public abstract class FileLocker {
private static final HashMap<File, Semaphore> locksMap = new HashMap<>();
public synchronized static final void getLock(final File file) {
if (!FileLocker.locksMap.containsKey(file)) {
FileLocker.locksMap.put(file, new Semaphore(1, Boolean.TRUE));
}
try {
FileLocker.locksMap.get(file).wait();
} catch (final InterruptedException e) {
SysLogger.log(e, "ERR0", SysLogger.Level.CRASH);
}
if (file.isDirectory()) {
for (final File f : file.listFiles()) {
if (f.isDirectory()) {
FileLocker.getLock(f);
}
}
}
}
public synchronized static final void releaseLock(final File file) {
if (file.isDirectory()) {
for (final File f : file.listFiles()) {
if (f.isDirectory()) {
FileLocker.releaseLock(f);
} else {
FileLocker.locksMap.get(file).notify();
}
}
}
FileLocker.locksMap.get(file).notify();
}
}
私の意図は、メソッドが同期されていないことでしたが、この例外を受け取り始めたので、メソッドを同期に変更して、理論的にはそれらに入るスレッドが使用されるリソースを所有していることを確認しましたが、機能していません。同じ例外が発生します。
例外トレース
:
org.lsp.io.files
.
org.lsp.main.Main.main(Main.java:9) の FileLocker.getLock(FileLocker.java:18 )
と呼ばれる
FileLocker.getLock(Paths.get("default.xml").toFile());