1. synchronized 的锁在 **对象** 上 2. 你的 food 是一个 Integer 类型对象的引用 3. 设想这样一个场景: 1. food 是 0,锁住了消费者 2. 生产者把 food 设置成了 1 3. 把消费者锁住的锁是 0,并没有人释放 1,所以消费者就一直被锁住了 4. 简而言之,专门的锁交给专门的对象做 5. 顺便一说,默认情况下 -255 到 255 的 Integer 对象都是复用的,如果你在某个地方用 0 作为锁,可能会把其他地方用 0 做锁的逻辑锁住…String 也有类似的问题,所以一般就随手 new Object 当锁用