双标志先检查法:检查与上锁之间被切换

P0

while (flag[1]);
flag[0] = true;
critical section;
flag[0] = false;

P1

while (flag[0]);
flag[1] = true;
critical section;
flag[1] = false;

共享状态

flag[0]false
flag[1]false
临界区空闲

问题根源:先检查,再上锁;这两个动作不是原子操作。