Dekker算法和Peterson算法解决互斥锁的并发的Java实现

假设P、Q两个进程需要互斥进入某一个临界区。

Dekker算法的基本思想是:首先看P、Q是否有进入临界区的意愿,(1)如果没有进程想进临界区,自然不用做任何事情,(2)如果只有一个进程想进临界区,就让他进入临界区,(3)如果两个进程同时都想进临界区,那么再看轮到谁进临界区了,如果刚好轮到P,P就进入临界区,Q等待,P退出临界区后Q再进入;同样,如果刚好轮到Q,Q就进入临界区,P等待,Q退出临界区后P再进入。

Dekker算法的具体实施方法:
(1)设置两个布尔变量pturn,qturn。pturn为true,表示P想进入临界区,为false,表示P不想进入临界区;qturn为true,表示Q想进入临界区,为false,表示Q不想进入临界区;它们的默认值为false。
(2)设置一个整型变量turn,表示当P、Q同时想进临界区时,该谁进临界区。如果turn等于1,表示轮到P进入临界区;如果turn等于2,表示轮到Q进入临界区。
(3)具体代码(Java实现):
首先由共同变量:

private boolean pturn = false;  
private boolean qturn = false;  
private int turn = 1;  

P进程代码:

pturn = true;// 表示P想进入临界区 
while (qturn) {// 如果Q也想进入临界区,进入循环 
    if (turn == 2) {// 如果轮到Q进临界区 
        pturn = false;// P先放弃进入临界区的意愿 
        while (turn == 2) {// 等待turn等于1,也就是等待轮到自己 

        }  
        pturn = true;// P想进入临界区 
    }  
}  
//临界区
turn = 2;// P离开临界区,轮到Q进入临界区了 
pturn = false;// P不想进入临界区

Q进程代码:

qturn = true;// 表示Q想进入临界区 
while (pturn) {// 如果P也想进入临界区,进入循环 
    if (turn == 1) {// 如果轮到P进临界区 
        qturn = false;// Q先放弃进入临界区的意愿 
        while (turn == 1) {// 等待turn等于2,也就是等待轮到自己 

        }  
        qturn = true;// Q想进入临界区 
    }  
}  
// 临界区 
turn = 1;// Q离开临界区,轮到P进入临界区了 
qturn = false;// Q不想进入临界区 

Peterson算法是一个实现互斥锁的并发程序设计算法,可以控制两个进程访问一个共享的单用户资源而不发生访问冲突。

public class Peterson implements Runnable {  

    private static boolean[] in = { false, false };     // 主观地表示某一个进程是否希望使用资源 
    private static volatile int turn = 0;               // 客观地表示哪一个进程有权使用进程 

    public static void main(String[] args) {  
        new Thread(new Peterson(0), "mazhongyi").start();  
        new Thread(new Peterson(1), "panpeizhu").start();  
    }  

    private final int id;  

    public Peterson(int i) {  
        id = i;  
    }  

    private int other() {  
        return id == 0 ? 1 : 0;  
    }  

    @Override  
    public void run() {  
        int cnt = 5;  
        while(cnt-- > 0){  
            in[id] = true;      // 表示本进程想使用资源 
            turn = other();     // 谦让,把使用进程的权限让给对方进程 
            while (in[other()] && turn == other()) {    // 如果对方进程想使用资源,且对方进程有使用资源的权限时,本进程等待 
                System.out.println("[" + id + "] - wait...");  
            }  
            System.out.println("-------------------[" + id + "] Working");  
            in[id] = false;     // 本进程用完资源后,必须表示不再想用资源 
        }  

    }  
} 
    原文作者:java锁
    原文地址: https://blog.csdn.net/u010941728/article/details/51722725
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞