【发布时间】:2013-07-10 14:36:46
【问题描述】:
我正在实现一个控制器类,它必须在处理相同类型数据的线程上应用锁。因此,在这种情况下,我构建了两个用于应用和释放锁的类。
现在我在重新锁定时收到 IllegalMonitorStateException 异常。 我知道目前我在另一个线程的监视器中。
这是锁定机制:
ConcurrentHashMap<String, Thread> Map = new ConcurrentHashMap<String, Thread>();
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
final Object lock = new Object();
for (Thread thread : threadSet) {
StringBuffer sb = new StringBuffer(thread.getName().toString());
if ((sb.length() == 22) && (sb.toString().matches("[0-9]+"))
&& (thread != Thread.currentThread())) {
utiMap.put(thread.getName().toString(), thread);
}
}
synchronized (lock) {
if (utiMap.containsKey(key)) {
try {
lock.wait();
} catch (InterruptedException e) {
lock.notifyAll();
}
}
}
以下是锁释放逻辑。
ConcurrentHashMap<String, Thread> Map = new ConcurrentHashMap<String, Thread>();
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
Object lock = new Object();
for (Thread thread : threadSet) {
StringBuffer sb = new StringBuffer(thread.getName().toString());
if ((sb.length() == 22) && (sb.toString().matches("[0-9]+"))
&& (thread != Thread.currentThread()) && thread.getState().name().equals("WAITING")) {
utiMap.put(thread.getName().toString(), thread);
System.out.println("I am in controller Release -- ");
thread.resume();
}
}
【问题讨论】:
-
我没有看到任何锁定。被锁定的对象只能在任何地方创建和使用。你有更完整的例子吗?
-
不要用StringBuffer,十几年前就被StringBuilder代替了。
-
@BITSSANDESH 所以向我们展示有问题的代码,而不是有效的代码。顺便说一句 resume() 已弃用,只能在您不应该使用的挂起()线程上使用。
-
目前尚不清楚您要实现什么目标或为什么要这样做,但是您的代码存在很多问题,我不确定您是否应该尝试这样做。这是 Oracle 专家说你不应该尝试的那种事情,除非你真的、真的知道自己在做什么,否则这可能是一个非常糟糕的主意。
-
好的,在 Java 中已经有许多信号/消息传递/工作传递方法以及许多也执行此操作的第三方库中,您认为最相似的是什么以及您需要它如何不一样?
标签: java multithreading jvm