前言
有关Peterson解答的记录; 若有不当之处,请您指出,你的指点是我的荣幸!
Peterson解答
Peterson解答是一个经典的基于软件的临界区问题的解决方案
Peterson算法适用于两个进程交错执行临界区与剩余区
在本文中,这两个进程分别是P0和P1
Peterson解答要求两个进程共享两个数据项
int turn
;
boolean flag
[2];
变量turn表示哪个进程可以进入临界区;即如果turn==i,那么进程Pi允许在临界区内执行。数组flag表示哪个进程准备进入临界区。
例如:如果flag[i]为true,那么进程Pi准备进入临界区。
为了进入临界区,进程Pi首先设置flag[i]的值为true;并且设置turn的值为j,从而表示如果另一个进程Pj希望进入临界区,那么Pj就能进入。
如果同时有两个进程同时试图进入,那么turn的值会同时被设置成i和j然而只有一个赋值语句的结果会被保持;另一个也会被设置,但会被立即重写。Peterson的关键就在于turn的最终值!它决定哪个进程进放入临界区!
代码实现:
public class Test01 implements Runnable {
private static int ticket
= 20;
private static boolean[] flag
= {false, false};
private static int turn
;
public static void main(String
[] args
) {
new Thread(new Test01(), "0").start();
new Thread(new Test01(), "1").start();
}
@Override
public void run() {
int num
= Integer
.valueOf(Thread
.currentThread().getName());
int other
=num
==0?1:0;
do {
flag
[num
] = true;
turn
= other
;
while (flag
[other
] && turn
== other
) {
}
if (ticket
<= 0) {
System
.out
.println("票已售空");
return;
}
System
.out
.println("Thread-->" + num
+ "-->is waiting......" + ticket
-- + "-->turn-->" + turn
);
flag
[num
] = false;
try {
Thread
.sleep(500);
} catch (InterruptedException e
) {
e
.printStackTrace();
}
} while (true);
}
}