文章目录
wait 只释放当前monitor 的demo
- wait 只释放当前monitor 的demo
如下的代码示例, 演示了 wait方法, 只释放当前锁资源. 给出了两个资源resourceA 和resourceB . 线程a中, 使用了两个同步代码块, 分别需要resourceA 和resourceB 这两把锁. 在resourceB 这把锁内, 使用了resourceA.wait();
方法, 把resourceA的锁释放了. 但是没有释放B . 在线程b中也两个同步代码块, 分别需要resourceA 和resourceB 这两把锁. 由于a只释放了resourceA一把锁, 所以无法 进入需要resourceB 的代码块中.
package com.thread.threadobjectclasscommonmethods;
/**
* 类名称:WaitNotifyReleaseOwnMonitor
* 类描述: wait 只释放当前monitor
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/8/29 16:27
* Version 1.0
*/
public class WaitNotifyReleaseOwnMonitor {
private static final Object resourceA = new Object();
private static final Object resourceB = new Object();
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
synchronized (resourceA) {
System.out.println("a got resourceA");
synchronized (resourceB) {
System.out.println("a got resourceB ");
try {
System.out.println("a 释放了锁 resourceA 但还持有 resourceB ");
resourceA.wait();
System.out.println("a 重新获得了锁 ");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Thread thread2 = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (resourceA) {
System.out.println("b got resourceA lock ");
System.out.println("b 尝试获取 resourceB lock ");
synchronized (resourceB) {
System.out.println(" b resourceB got ");
}
}
});
thread1.start();
thread2.start();
}
}
控制台打印如下 线程b由于没有获取到resourceB ,无法进入到需要resourceB 的代码块中 . 而线程a由于调用了wait, 而且没有线程去唤醒 . 因此程序一直处于阻塞状态.
由此可以得出 wait 只释放当前monitor. 即程序中, wait只释放了resourceA , 没有 释放resourceB