我想通过Swap函数解决互斥问题,但程序遭受死锁,我不知道为什么。这似乎是一个线程exec连续两次发生的问题。Java - 使用SWAP函数解决互斥问题的死锁
的交换锁逻辑:
每个线程化妆使用本地可变的和共享变量。 线程首先锁定其本地变量(例如,假定1个值)。 当一个线程本地变量被解锁(例如假设0的值),它可以执行该临界区,如果线程本地变量被锁定(例如假设值为1)的线程处于忙着等待(该忙等待测试本地变量解锁并调用交换功能)
交换函数设定本地变量到共享变量值和viceversa.The交换功能必须是原子的。
当一个线程呼叫交换,如果“共享”的变量交换后为0(解锁),我们有共享变量是1和本地为0 因此,只有该线程可以访问到关键部分没有其他人。
最后(没有更多关键部分)线程解锁共享变量。
主
public class Mutex {
public static void main(String []args){
LockVar var = new LockVar(0);
ThreadSwap th0 = new ThreadSwap(var);
ThreadSwap th1 = new ThreadSwap(var);
ThreadSwap th2 = new ThreadSwap(var);
th0.start();
th1.start();
th2.start();
}
}
线程类
class ThreadSwap extends Thread{
private LockVar shared_var;
public ThreadSwap(LockVar var){
this.shared_var = var;
}
@Override
public void run(){
LockVar local = new LockVar(1);
while(true){
---> local.setVar(1);
---> while(local.getVar() == 1){Synch.SWAP(shared_var, local);}
System.out.println("Thread " + getId() + " exec critical section.");
// Critical section
System.out.println("Thread " + getId() + " is leaving critical section.");
---> shared_var.setVar(0);
}
}
}
交换功能(这种类型的互斥锁强调的逻辑)
class Synch{
public static synchronized void SWAP(LockVar shared, LockVar local){
int temp = shared.getVar();
shared.setVar(local.getVar());
local.setVar(temp);
}
...
}
共享VAR类
class LockVar{
private volatile int var;
public LockVar(int value){
this.var = value;
}
public int getVar(){
return this.var;
}
public void setVar(int value){
this.var=value;
}
}
什么是ThreadTaS? – user2891462
预期结果是什么?你得到的实际结果是什么? 请注意,您在每个循环的末尾以非同步的方式使用setVar。 – user2891462
对不起,我将编辑正确的代码.. – MadDogTannen