gpt4 book ai didi

java - 那个 IllegalMonitorStateException...线程不拥有该对象?不可能,只有一个

转载 作者:行者123 更新时间:2023-11-29 07:05:28 25 4
gpt4 key购买 nike

<分区>

我有这个类,它是文件锁定实用程序的基本方法(不与来自操作系统的锁交互)。这个想法是有一个静态的 HashMap,它存储对 File 对象的引用对,这些对象由具有二进制信号量的应用程序使用。在第一次访问新文件时,该对存储在变量中。问题是 .wait() 行抛出 IllegalMonitorStateException,我不明白为什么,因为我创建了一个项目来测试这个类,只有一个线程,所以访问该方法的线程不拥有是不可能的对象,不是吗?

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();
}
}

我的本​​意是这些方法不是同步的,但自从我开始收到这个异常后,我将它们更改为同步的,这样它们理论上可以确保进入它们的线程拥有所使用的资源,但它不起作用,同样的异常出现。

异常跟踪:线程“main”中的异常 java.lang.IllegalMonitorStateException
在 java.lang.Object.wait(本地方法)
在 java.lang.Object.wait(Object.java:503)
在 org.lsp.io.files.FileLocker.getLock(FileLocker.java:18)
在 org.lsp.main.Main.main(Main.java:9)

调用

FileLocker.getLock(Paths.get("default.xml").toFile());

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com