我想通過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