java 线程 同步代码块 sleep的问题(买包子小案例)

小案例实现 顾客:买包子,店主:(几秒后)做好包子,顾客:吃包子

为什么把店主的sleep放在synchronized外就可以顺利执行,放在synchronized里面就会有如图1情况图片说明

图2 是想要效果图片说明

在锁里面休息,出来之后还是会继续抢夺CPU的执行权,也就容易出现同一个线程多次执行,另外一个线程运气不好抢不到执行权,也就容易出现图一的问题

锁外面休息,等于线程执行出来了,就休息,然后等待唤醒,这样保证同一时间只有一个线程在运行,执行完了就休息,唤醒另外一个线程,这个是典型的生产者与消费者模式

sleep在synchronized外部,是做好包子这个线程整体休眠,每隔30ms循环做一个包子。sleep在synchronized内部,是while一直循环做包子,然后每隔三十秒做好一个