[英]Developing a synchonisation algorithim with Semaphores
嗨,我想在 Java 中設計一個算法,以防止簡單的火車模擬器出現死鎖,我試圖解決兩列火車想要進入臨界區的問題一旦線程處於臨界區,它基本上會隨機休眠其他人等待的時間我不擔心飢餓
到目前為止,我有這個及其對 dekkers 算法的粗略實現。
public void runTrain() throws RailwaySystemError {
Clock clock = getRailwaySystem().getClock();
Railway nextRailway = getRailwaySystem().getNextRailway(this);
while (!clock.timeOut() && !errorOccurred()) {
announceIntention();
getFlag.putSFlag(this);
while(nextRailway.getFlag.hasFlag(this)) {
if(getSharedFlag.hasFlag(this)) {
getFlag.takeFlag(this);
while(getSharedFlag.hasFlag(this)) {
sleep();
}
getFlag().putFlag(this); // else
}
}
crossPass();
if (!getFlag.hasFlag(this)){
getSharedFlag.putFlag(this);
}
getFlag().takeFlag(this);
}
}
這兩列火車的代碼幾乎相同。
我試圖完成同樣的事情但是exclusivley使用Java信號量算法不需要被飢餓所困擾,只是防止死鎖
任何幫助將不勝感激謝謝
如果要使用 Semaphore 進行互斥:
import java.util.concurrent.Semaphore;
public class Train {
static Semaphore semaphore = new Semaphore(1);
public void crossPath() throws InterruptedException {
semaphore.acquire();
try {
//critical section
} finally {
semaphore.release();
}
}
}
注意 try-finally 的使用。 這樣我們就可以確定即使是臨界區中的代碼拋出異常,我們也會釋放鎖。
在 Java 中也可以使用synchronized
關鍵字來實現互斥。 這里我們使用 Train class 的內在鎖進行同步。 這意味着沒有兩個 Train 實例可以同時執行同步塊中的代碼。
public class Train {
public void crossPath(){
synchronized (Train.class){
///critical section - only one instance of Train can be here at a given time
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.