这里涉及了消费者、生产者、面包和篮子,其中面包和篮子是多线程共同操作的资源,生产者线程生产面包放进篮子,消费者线程从篮子中取出面包。理想的代码是将生产任务和消费任务都封装在资源类中,因为面包是篮子容器的元素,所以不适合封装到面包类中,而且封装到篮子中,能更方便地操作容器。
注意,一定要将所有涉及资源操作的代码都放进锁的内部,否则会产生多线程不同步问题。例如,在Producer类中定义了生产面包的方法produce(),然后将其作为放进篮子的方法basket.in()的参数,即basket.in(producer()),这是错误的行为,因为produce()是在锁的外部执行后才传递给in()方法的。