您当前的位置: 首页 >  Java

java持续实践

暂无认证

  • 1浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java多线程 wait 只释放当前monitor

java持续实践 发布时间:2020-08-29 16:56:55 ,浏览量:1

文章目录
      • 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

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.1645s