针对sleep和wait方法来探究锁的释放情况

针对sleep和wait方法来探究锁的释放情况

1、sleep方法

1.1 demo案例
public class TestSleepOrWait {

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

        // 构建锁对象
        Object lock = new Object();

        // sleep 休眠
        Thread t1 = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "==准备抢锁!");
            // 加锁
            synchronized (lock) {
                System.out.println(Thread.currentThread().getName() + "==抢到锁了!");
                System.out.println(Thread.currentThread().getName() + "==准备进入沉睡,当前时间:" + LocalDateTime.now());
                try {
                    // 沉睡5s
                    TimeUnit.SECONDS.sleep(5);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println(Thread.currentThread().getName() + "==结束沉睡,当前时间:" + LocalDateTime.now());
            }
        }, "T1");
        // 启动线程
        t1.start();
        
        // 等待线程先获取锁
        Thread.sleep(200);

        // 尝试获取锁
        System.out.println("主线程尝试获取锁" + LocalDateTime.now());
        synchronized (lock) {
            System.out.println("主线程获取到锁" + LocalDateTime.now());
        }
    }
}
1.2 执行结果
T1==准备抢锁!
T1==抢到锁了!
T1==准备进入沉睡,当前时间:2024-01-09T13:15:56.440
主线程尝试获取锁2024-01-09T13:15:56.596
T1==结束沉睡,当前时间:2024-01-09T13:16:01.453

// 当主线程获取到锁时 差不多刚好是线程T1结束沉睡的时间(间隔时间5s)
// 说明sleep方法不会释放锁资源
主线程获取到锁2024-01-09T13:16:01.453

2.wait方法

2.1 demo案例
public class TestSleepOrWait {

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

        // 构建锁对象
        Object lock = new Object();

        // wait方法 休眠
        Thread t2 = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "==准备抢锁!");
            synchronized (lock) {
                System.out.println(Thread.currentThread().getName() + "==抢到锁了!");
                System.out.println(Thread.currentThread().getName() + "==准备进入沉睡,当前时间:" + LocalDateTime.now());
                try {
                    // 休眠五秒
                    lock.wait(5000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println(Thread.currentThread().getName() + "==结束沉睡,当前时间:" + LocalDateTime.now());
            }

        }, "T2");

        // 启动线程
        t2.start();
        // 等待线程先获取锁
        Thread.sleep(200);

        // 尝试获取锁
        System.out.println("主线程尝试获取锁" + LocalDateTime.now());
        synchronized (lock) {
            System.out.println("主线程获取到锁" + LocalDateTime.now());
        }
    }
}
2.1 运行结果
T2==准备抢锁!
T2==抢到锁了!
T2==准备进入沉睡,当前时间:2024-01-09T13:22:10.678

主线程尝试获取锁2024-01-09T13:22:10.831
主线程获取到锁2024-01-09T13:22:10.831

// T2线程结束沉睡时间,居然在主线程获取到锁之后 
// 说明wait方法会释放锁资源
T2==结束沉睡,当前时间:2024-01-09T13:22:15.687

3、二者的区别之处

3.1 锁的归属

wait方法所属Object类;sleep方法所属Thread类

在这里插入图片描述
在这里插入图片描述

3.2 锁的释放

sleep方法不会释放锁资源;wait方法会释放锁资源;

3.3 锁的唤醒
  • sleep在指定的毫秒数内休眠,时间到了会自主唤醒.
    在这里插入图片描述
  • wait方法当时间到了不会自主唤醒,需要结果notify方法(唤醒)配对使用,若没有notify方法唤醒时,可能会存在即:“所谓的虚假唤醒”。
    在这里插入图片描述

结合以上三个方面,对sleep和wait方法来探究锁的释放情况进行了简要知识的弥补,希望可以增加童鞋们的理解!若存在异议的地方还望进行指正!

本篇文章是2024年的首篇文章,首先是祝愿大家,在新的一年有一个新的开始,然后对自己先制定一个小目标,那就是每天进步一点点,最后希望得到各位朋友们的支持与点赞,后面也会继续持续输出,互相监督哦(嘿嘿!!).

  • 每日一语

精彩的人生总有精彩的理由,笑到最后的才会笑得更甜。

在这里插入图片描述

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值