排队打饭:公平锁和非公平锁(面试)

如上代码:我们定义一个内部类 DiningRoom 表示食堂,getFood方法里面用synchronized锁修饰this指向DiningRoom的实例对象(22行中的diningRoom对象),主类中让编号001至005五个同学同时去打饭,用于测试先排队的同学是否能先打到饭?运行程序得到 其中一种 执行结果如下图所示,002->004->001->003->005同学先去排队,但打饭的顺序是002->003->001->004->005,说明这里003和001两个同学插队了,插到004前面了,我们详细分析执行过程,002先抢到锁打饭了,释放了锁,本来应该是接下来是004抢到锁去打饭(因为004是比003先来排队),但003抢到锁,打饭了,释放了锁,这是第一次插队。现在还是来004抢锁,但是没抢到又被001抢到了,释放锁后才被004抢到,这是第二次插队,后面分别再是004->005抢到锁,释放锁,程序执行完毕。因为003和001插队,我们用代码 证明了synchronized是非公平锁。紧接着我们来看下ReentrantLock公平锁和非公平锁。