Peterson解答

前言

有关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的值会同时被设置成ij然而只有一个赋值语句的结果会被保持;另一个也会被设置,但会被立即重写。Peterson的关键就在于turn的最终值!它决定哪个进程进放入临界区!

代码实现:

/**
 * 测试Peterson算法
 */
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) {
                //do nothing
            }
            //临界区
            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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值