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 22:03:03 浏览: 98
这个错误是 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() 方法唤醒等待的线程。唤醒后,该线程会重新尝试获取锁并继续执行代码。
相关问题
https://blog.csdn.net/pwang95/article/details/106343667
这篇博客文章《Java设计模式之单例模式详解》介绍了单例模式(Singleton Pattern)的概念。单例模式是一种常用的设计模式,它保证一个类只有一个实例,并提供全局访问点。这种模式通常用于需要控制资源获取次数或者确保系统有且仅有一个特定类型的实例的情况。
在Java中,实现单例模式主要有两种常见方法:
1. 饿汉式(Eager Singleton):在类加载时就创建了单例实例,适合对性能要求较高的场景。
```java
public class Singleton {
private static Singleton instance;
// 构造函数私有化,防止外部直接创建实例
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
2. 懒汉式(Lazy Singleton):只有当第一次请求时才创建实例,可以进一步分为线程安全版本(使用synchronized关键字)和双重检查锁定(Double-Checked Locking)版本,后者在高并发下效率更高。
饿汉式Java代码
饿汉式Java代码是指在程序启动时就创建对象实例,而不是在需要时再创建。以下是一个简单的饿汉式Java代码示例:
```
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
```
在这个示例中,我们在类加载时就创建了一个 Singleton 对象实例,并提供了一个静态方法 getInstance() 来返回该实例。由于这种方式在程序启动时就创建了对象实例,因此被称为饿汉式单例模式。
阅读全文