簡體   English   中英

使用信號量開發同步算法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM