// 最近看了Peterson算法,Peterson使用了两个变量
// 但是我个人感觉貌似只用一个变量去控制也可以?
// 说明:
// 1. 为什么用volatile?因为当前语境下只要求覆盖写即可,flag = x 告诉对方谁应该占有即
// 可,不涉及 读-改-写 操作
// 2. 和 peterson 算法有同样的问题,就是一个进程进入临界区之后来不及在离开前修改flag
// 就挂掉的话,那么另一个进程只能忙等
public class Peterson {
static volatile int turn = -1;
static int how = 0;
public static class P1 implements Runnable {
@Override
public void run() {
turn = 2;
while (turn != 1) {
}
how ++;
turn = 2;
}
}
public static class P2 implements Runnable {
@Override
public void run() {
turn = 1;
while (turn != 2) {
}
how ++;
turn = 1;
}
}
public static void main (String[] args) throws InterruptedException {
while (true) {
Thread t1 = new Thread(new P1());
Thread t2 = new Thread(new P2());
t1.start();
t2.start();
t1.join();
t2.join();
if (how != 2) {
break;
}
how = 0;
turn = -1;
}
System.out.println("?" + how);
}
}