Dekker算法解决操作系统中互斥现象,代码如下:
package Test;
public class Dekker {
public static void main(String[] args) throws InterruptedException {
//1.创建了一个账户,初始2000;
Account account = new Account(2000);
//2.创建两个线程
ATMThread atm = new ATMThread(account);
EPayThread epay = new EPayThread(account);
//3.并发执行两个进程
atm.start();
epay.start();
atm.join();
epay.join();
System.out.println("2秒后显示余额:");
Thread.sleep(2000);
account.printBalance();
}
}
class GlobalSRC{
//public static volatile int turn = 0;
public static volatile boolean[] flag = new boolean[] {false,false};
}
//p0
class ATMThread extends Thread{
private Account account;
public ATMThread(Account account) {
this.account=account;
}
public void run() {
//调用widthdraw()就是访问临界资源的代码
GlobalSRC.flag[0]=true;//p0想进
while(GlobalSRC.flag[1]==true ) {//判断p1在不在,一直盯着看
GlobalSRC.flag[0]=false;//把自己的状态一直来回切换,紧盯p0
GlobalSRC.flag[0]=true;
}
//--------Critical Section Start-----
int result = account.widthdraw(1600);//ATM取款1600
//--------Critical Section End-----
GlobalSRC.flag[0]=false;//执行完了就把状态回归为false;
if(result==-1) {
System.out.println("ATM取款失败");
}else{
System.out.println("ATM取款成功取出"+result+"元");
}
}
}
//p1
class EPayThread extends Thread{
private Account account;
public EPayThread(Account account) {
this.account=account;
}
public void run() {
//调用ePay()就是访问临界资源的代码
GlobalSRC.flag[1]=true;//p1想进
while(GlobalSRC.flag[0]==true )//判断p0在不在,一直盯着看
{
GlobalSRC.flag[1]=false;//把自己的状态一直来回切换,紧盯p0
GlobalSRC.flag[1]=true;
}
//--------Critical Section Start-----
int result = account.ePay(800);
//--------Critical Section End-----
GlobalSRC.flag[1]=false;//执行完了就把状态回归为false;
if(result==-1) {
System.out.println("网银支付失败");
}else{
System.out.println("网银支付成功,支付"+result+"元");
}
}
}
class Account{
private int balance;
public void printBalance() {
System.out.println("账户余额:"+this.balance);
}
public Account(int amount) {
this.balance = amount;
}
//通过ATM取款
public int widthdraw(int amount) {
if(amount<=0 || amount>balance) {
return -1;
}else {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
balance = balance-amount;
return amount;
}
}
//通过网银支付
public int ePay(int amount) {
if(amount<=0 || amount>balance) {
return -1;
}else {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
balance = balance-amount;
return amount;
}
}
}
有需要做实验报告的同学可以利用一下哦!