针对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年的首篇文章,首先是祝愿大家,在新的一年有一个新的开始,然后对自己先制定一个小目标,那就是每天进步一点点,最后希望得到各位朋友们的支持与点赞,后面也会继续持续输出,互相监督哦(嘿嘿!!).
- 每日一语
精彩的人生总有精彩的理由,笑到最后的才会笑得更甜。