什么是锁池?什么是等待池?以及sleep,和wait的区别是什么?

锁池(Lock Pool)

想象一下,你和你的朋友们在排队买电影票。锁池就像是电影院门口的排队系统,它管理着所有想要买票的人。当电影院的售票窗口只有一个时,只有排在最前面的人(持有锁的人)才能买票。如果这个人正在买票,其他人都必须等待,直到轮到他们。

在Java中,锁池管理着所有想要获取对象锁的线程。当一个线程获得了锁(比如进入了一个同步方法或代码块),其他线程就必须等待,直到这个线程释放锁。

对象等待池(Wait Set)

继续上面的例子,如果电影院的售票窗口关闭了,正在排队的人(持有锁的线程)会告诉其他人“请等待,我需要休息一下”。然后,这个人会离开售票窗口,进入电影院的休息区(对象等待池)。其他想要买票的人(其他线程)可以继续排队,但不能买票,直到这个人(持有锁的线程)从休息区回来。

在Java中,当一个线程调用对象的wait()方法时,它会释放对象的锁,并进入对象的等待池。其他线程可以继续执行,直到有线程调用notify()notifyAll()方法,这时等待池中的线程会被唤醒,并有机会重新获取锁。

sleep() 和 wait() 的区别

现在,让我们用一个简单的例子来说明sleep()wait()的区别。

假设你正在做家务,你决定休息一下,于是你告诉你的家人“我要休息10分钟”。在这10分钟内,你不会做任何家务,但你的家人可以继续做其他事情。10分钟后,你醒来并继续做家务。这就是sleep()方法的使用场景。

try {
    Thread.sleep(10000); // 休息10秒
    // 继续做家务
} catch (InterruptedException e) {
    // 如果线程在睡眠期间被中断,处理异常
}

现在,让我们看看wait()方法的例子。假设你正在和你的家人玩一个游戏,你告诉他们“我需要等待,直到轮到我”。你进入等待状态,直到你的家人叫你“轮到你了”。这时,你醒来并继续游戏。

synchronized (object) {
    try {
        object.wait(); // 等待直到被通知
        // 继续游戏
    } catch (InterruptedException e) {
        // 如果线程在等待期间被中断,处理异常
    }
}

在这个例子中,object.wait()方法释放了对象的锁,并将当前线程放入对象的等待池中。当其他线程调用object.notify()object.notifyAll()时,等待池中的线程会被唤醒,并有机会重新获取锁。

sleep()方法让线程暂停执行一段时间,而wait()方法让线程释放锁并进入等待状态,直到被其他线程唤醒。在使用这些方法时,需要根据线程同步的需求来选择合适的方法。

功能上关键的区别:

sleep() 和 wait() 都是Thread类中的静态方法,它们都可以使当前线程暂停执行一段时间。然而,它们在使用和功能上有一些关键的区别:

1.线程状态

  • sleep() 方法使当前线程暂停执行指定的时间,但不会释放对象锁。线程在睡眠期间仍然持有对象锁,其他线程无法访问该对象的同步代码块。
  • wait() 方法使当前线程暂停执行,并释放它所持有的对象锁。线程进入对象的等待池,等待其他线程的notify()notifyAll()方法来唤醒它。

2.使用方式

  • sleep() 方法可以被任何线程调用,包括非同步代码块中的线程。
  • wait() 方法只能在同步代码块中被调用,且必须在调用wait()方法的线程持有对象锁的情况下。

3.唤醒条件

  • sleep() 方法的线程在指定时间结束后自动唤醒。
  • wait() 方法的线程需要其他线程调用notify()notifyAll()方法来唤醒。

4.异常处理

  • sleep() 方法不会抛出InterruptedException异常,除非在sleep()方法调用之前线程已经被中断。
  • wait() 方法会抛出InterruptedException异常,如果线程在等待期间被中断。
  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

warming1112

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值