Single Threaded Execution模式

一、定義

Single Threaded Execution 是指“以1個線程執(zhí)行”的意思,有時也稱為Critical Section(臨界區(qū))。

二、模式案例

案例:
假設(shè)有三個人,頻繁地通過一扇門,規(guī)定每次只能通過一個人,當(dāng)通過一個人時,程序會將通過的總?cè)舜渭?,同時記錄該次通過人的姓名和出生地。

門的定義:

public class Gate {
    private int counter = 0;
    private String name = "Nobody";
    private String address = "Nowhere";
    
    public void pass(String name, String address) {
        this.counter++;
        this.name = name;
        this.address = address;
        check();
    }
    private void check() {
        if (name.charAt(0) != address.charAt(0)) {
            System.out.println("***** BROKEN ***** " + toString());
        }
    }
    public String toString() {
        return "No." + counter + ": " + name + ", " + address;
    }
}

人的定義:

public class UserThread extends Thread {
    private final Gate gate;
    private final String myname;
    private final String myaddress;
    public UserThread(Gate gate, String myname, String myaddress) {
        this.gate = gate;
        this.myname = myname;
        this.myaddress = myaddress;
    }
    public void run() {
        System.out.println(myname + " BEGIN");
        while (true) {
            gate.pass(myname, myaddress);
        }
    }
}

執(zhí)行:

public class Main {
    public static void main(String[] args) {
        System.out.println("Testing Gate, hit CTRL+C to exit.");
        Gate gate = new Gate();
        new UserThread(gate, "Alice", "Alaska").start();
        new UserThread(gate, "Bobby", "Brazil").start();
        new UserThread(gate, "Chris", "Canada").start();
    }
}

結(jié)果:

Testing Gate, hit CTRL+C to exit.
Alice BEGIN
Bobby BEGIN
Chris BEGIN
***** BROKEN ***** No.3: Chris, Alaska
***** BROKEN ***** No.3: Chris, Alaska
***** BROKEN ***** No.3: Chris, Alaska
***** BROKEN ***** No.6: Alice, Canada
***** BROKEN ***** No.6: Alice, Canada
***** BROKEN ***** No.6: Alice, Canada
***** BROKEN ***** No.9: Bobby, Brazil
***** BROKEN ***** No.10: Bobby, Alaska

分析:
可以看到,上述Gate類并非線程安全的,因?yàn)閜ass方法會被多個線程同時調(diào)用,且該方法中會修改Gate類字段的值。

優(yōu)化:

//將Gate類變?yōu)榫€程安全的類:
public class Gate {
    private int counter = 0;
    private String name = "Nobody";
    private String address = "Nowhere";
     
    public synchronized void pass(String name, String address) {
        this.counter++;
        this.name = name;
        this.address = address;
        check();
    }
    public synchronized String toString() {
        return "No." + counter + ": " + name + ", " + address;
    }
    private void check() {
        if (name.charAt(0) != address.charAt(0)) {
            System.out.println("***** BROKEN ***** " + toString());
        }
    }
}

三、模式講解

角色:
Single Threaded Execution 模式的角色如下:

  • SharedResource(共享資源)參與者
    SharedResource就是多線線程會同時訪問的資源類,該類通常具有2類方法:
    ①SafeMethod——從多個線程同時調(diào)用也不會發(fā)生問題的方法
    ②UnsafeMethod——從多個線程同時調(diào)用會發(fā)生問題,這類方法需要加以防護(hù),指定只能由單線程訪問區(qū)域,即臨界區(qū)(critical section)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容