为什么在while内的synchronized代码块中使用sleep之后notify没有释放锁,而是一直执行当前代码块语句?
发布网友
发布时间:2022-05-24 07:44
我来回答
共3个回答
热心网友
时间:2023-10-08 23:11
我的理解是:
线程并发执行,是通过cpu时间片轮转执行的,当你时间片执行完,线程1还占用着锁,线程2就会等待不会执行,然后线程1继续执行下一个时间片;
如果时间片执行完,线程1是没有占用锁,线程2才能执行;你在同步代码外面加了一句输出语句,只不过加大了时间片执行完线程是进行到同步代码块外的可能;
你可以试试去掉那句输出,也可能另一个线程也执行得到。
热心网友
时间:2023-10-08 23:11
notify语句释放锁来唤醒wait后,并不会立即执行,而是消费者与商家两个线程抢夺锁,谁抢到执行谁。
而sleep语句放到同步代码块外,可以人为保证消费者线程一定可以抢到锁
热心网友
时间:2023-10-08 23:12
notify只是唤醒线程,但没有立即释放锁,只有当synchronized代码块执行结束后才释放锁,所以将while循环放入同步代码块中调用notify会一直执行