Exception in thread "饿汉1" java.lang.IllegalMonitorStateException: current thread is not owner at java.base/java.lang.Object.wait(Native Method) at java.base/java.lang.Object.wait(Object.java:338) at com.itheima.d7_thread_communication.Desk.get(Desk.java:33) at com.itheima.d7_thread_communication.ThreadTest.lambda$main$3(ThreadTest.java:24) at java.base/java.lang.Thread.run(Thread.java:833) Exception in thread "饿汉2" java.lang.IllegalMonitorStateException: current thread is not owner at java.base/java.lang.Object.wait(Native Method) at java.base/java.lang.Object.wait(Object.java:338) at com.itheima.d7_thread_communication.Desk.get(Desk.java:33) at com.itheima.d7_thread_communication.ThreadTest.lambda$main$4(ThreadTest.java:27) at java.base/java.lang.Thread.run(Thread.java:833)
时间: 2023-12-01 08:03:03 浏览: 41
这个错误是 IllegalMonitorStateException,意思是当前线程不是锁的拥有者,不能进行wait或notify操作。在你的代码中,线程在 Desk 类的 get() 方法中调用了 wait() 方法,但是没有先获取锁,因此抛出了该异常。
要解决这个问题,你需要在调用 wait() 方法之前先获取锁,可以使用 synchronized 关键字来实现。在 Desk 类的 get() 方法中,将 wait() 方法调用放在一个 synchronized 块中,如下所示:
```
public synchronized void get() {
while (flag == false) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("取走:" + this.name + "-" + this.sex);
flag = false;
notify();
}
```
这样,当线程调用 get() 方法时,会先获取 Desk 对象的锁,然后再调用 wait() 方法等待。当其他线程调用 put() 方法并修改了 flag 值后,会调用 notify() 方法唤醒等待的线程。唤醒后,该线程会重新尝试获取锁并继续执行代码。
相关问题
1.什么是设计模式?常用的设计模式有哪些?
设计模式是经过前人无数次实践总结出的,可以反复使用的解决特定问题的设计方法。常用的设计模式包括但不限于以下几种:
1. 单例模式(懒汉式、饿汉式)
2. 工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
3. 适配器模式
4. 装饰器模式
5. 观察者模式
6. 策略模式
7. 模板方法模式
8. 建造者模式
9. 原型模式
10. 外观模式
用Java写14. 类和对象练习题:单例模式,创建一个类,该类无法通过构造方法创建对象,只能通过类提供的getInstance()静态方法获得该类对象。
好的,针对您的问题,我将为您提供一个基于Java语言的单例模式的实现示例。
在Java中实现单例模式的关键在于将类的构造方法私有化,这样就不能通过构造方法直接创建类的实例。同时,还需要提供一个静态方法,该方法可以返回该类的唯一实例。
下面是一个基于饿汉式的单例模式实现示例:
```
public class Singleton {
// 类的唯一实例
private static Singleton instance = new Singleton();
// 将构造方法私有化,防止外部直接创建实例
private Singleton() {
}
// 获取类的唯一实例
public static Singleton getInstance() {
return instance;
}
}
```
在上面的示例中,类的构造方法被私有化了,只能在类内部访问。同时,类的唯一实例被声明为静态变量,并在类加载时就被初始化。静态方法getInstance()返回该类的唯一实例。
使用该类时,只需要通过静态方法getInstance()获取类的唯一实例即可:
```
Singleton singleton = Singleton.getInstance();
```