gpt4 book ai didi

Java同步-IllegalMonitorStateException

转载 作者:行者123 更新时间:2023-12-01 23:43:32 26 4
gpt4 key购买 nike

我是否没有正确使用同步:

在下面的代码中我遇到了两个问题:
1.在将方法(designBusiness、createBusiness、sellBusiness)设置为 synchronized 时,就像在本例中一样,对 wait() 的调用显示 IllegalMonitorStateException 但我无法理解为什么?因为在 designBusiness 方法 Designer Thread 中确实获得了锁,因此它应该等待 wait 调用。我在 wait()notify() 上都收到 IllegalMonitorStateException。


2.即使当我删除 synchronized 关键字并使用 synchronized(this) block 特别是 wait()notify() 我仍然遇到死锁!为什么?

public class Main {
HashMap<String, Integer> map = new shop().orderBook();

public static void main(String[] args) throws InterruptedException {

Main main = new Main();

main.sellBusiness();
Thread.sleep(3000);
main.designBusiness();
Thread.sleep(3000);
main.createBusiness();
}

private synchronized void designBusiness() throws InterruptedException {

Thread designThread = new Thread(new Runnable() {
public void run() {
Set set = map.keySet();
System.out.println("Tracking OrderList");
System.out.println(set.size());
try {

System.out.println("waiting.........");
wait();
System.out.println("wait completed");

System.out.println("after design process items in orderList are "
+ map.keySet().size());
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}, "Designer Thread");
designThread.start();
System.out
.println("status of Designer Thread" + designThread.isAlive());
}

private synchronized void createBusiness() throws InterruptedException {
Thread createThread = new Thread(new Runnable() {

public void run() {
System.out.println(Thread.currentThread().getName()
+ " started");
Creator creator = new Creator();
creator.create(map);
notifyAll();
System.out.println("notified");

}
}, "Creator Thread");
createThread.start();
createThread.join();
System.out.println("status of Creator Thread" + createThread.isAlive());
}

private void sellBusiness() throws InterruptedException {
Thread sellThread = new Thread(new Runnable() {
public void run() {
Seller seller = new Seller();
seller.sellGold(45000, 15);
seller.sellSilver(14000, 60);
seller.noteOrder("Mrs Johnson", 15000, map);
seller.noteOrder("Mr. Sharma", 10000, map);
seller.sellGold(60000, 20);
seller.noteOrder("Mr. Hooda", 17500, map);
System.out.println(Thread.currentThread().getName()
+ " done selling");
}
}, "Seller Thread");
sellThread.start();
sellThread.join();
System.out.println("status of seller Thread" + sellThread.isAlive());
}
}

请帮助我找不到此问题的任何解决方案,我从昨晚开始寻找。

最佳答案

如果出现此异常,则说明您不在与您正在等待的对象同步的 block 或方法中。这就是异常(exception)的意义。唯一的意义。

您正在调用的 wait() 方法是在您正在创建的匿名内部类的实例上执行的。您从中创建它的同步方法在另一个对象上同步,并且当内部对象到达 wait() 调用时它也可能已经执行。

你需要弄清楚这里哪个对象是哪个。也许您需要调用 Main.this.wait(),但这取决于您认为您想要做什么,这从您的问题中并不清楚。

注意,你没有遇到死锁,而是遇到了无限 block 。这不是同一件事。

关于Java同步-IllegalMonitorStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17525246/

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