亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

Java多線程基礎(chǔ)(三)——Single Threaded Execution模式

Brenner / 1101人閱讀

摘要:門(mén)的定義人的定義執(zhí)行結(jié)果分析可以看到,上述類(lèi)并非線程安全的,因?yàn)榉椒〞?huì)被多個(gè)線程同時(shí)調(diào)用,且該方法中會(huì)修改類(lèi)字段的值。

一、定義

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

二、模式案例

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

門(mén)的定義:

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類(lèi)并非線程安全的,因?yàn)閜ass方法會(huì)被多個(gè)線程同時(shí)調(diào)用,且該方法中會(huì)修改Gate類(lèi)字段的值。

優(yōu)化:

//將Gate類(lèi)變?yōu)榫€程安全的類(lèi):
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就是多線線程會(huì)同時(shí)訪問(wèn)的資源類(lèi),該類(lèi)通常具有2類(lèi)方法:

①SafeMethod——從多個(gè)線程同時(shí)調(diào)用也不會(huì)發(fā)生問(wèn)題的方法
②UnsafeMethod——從多個(gè)線程同時(shí)調(diào)用會(huì)發(fā)生問(wèn)題,這類(lèi)方法需要加以防護(hù),指定只能由單線程訪問(wèn)區(qū)域,即臨界區(qū)(critical section)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/71488.html

相關(guān)文章

  • 網(wǎng)絡(luò)性能測(cè)試工具iperf的使用與參數(shù)解析

    摘要:介紹網(wǎng)絡(luò)性能評(píng)估主要是監(jiān)測(cè)網(wǎng)絡(luò)帶寬的使用率,將網(wǎng)絡(luò)帶寬利用最大化是保證網(wǎng)絡(luò)性能的基礎(chǔ),但是由于網(wǎng)絡(luò)設(shè)計(jì)不合理網(wǎng)絡(luò)存在安全漏洞等原因,都會(huì)導(dǎo)致網(wǎng)絡(luò)帶寬利用率不高。 介...

    icattlecoder 評(píng)論0 收藏0
  • Java基礎(chǔ)學(xué)習(xí)——線程之單例設(shè)計(jì)模式(轉(zhuǎn))

    摘要:總之,選擇單例模式就是為了避免不一致?tīng)顟B(tài),避免政出多頭。二餓漢式單例餓漢式單例類(lèi)在類(lèi)初始化時(shí),已經(jīng)自行實(shí)例化靜態(tài)工廠方法餓漢式在類(lèi)創(chuàng)建的同時(shí)就已經(jīng)創(chuàng)建好一個(gè)靜態(tài)的對(duì)象供系統(tǒng)使用,以后不再改變,所以天生是線程安全的。 概念:  Java中單例模式是一種常見(jiàn)的設(shè)計(jì)模式,單例模式的寫(xiě)法有好幾種,這里主要介紹兩種:懶漢式單例、餓漢式單例。  單例模式有以下特點(diǎn):  1、單例類(lèi)只能有一個(gè)實(shí)例?!?..

    dendoink 評(píng)論0 收藏0
  • php 線程pthreads官網(wǎng)翻譯

    摘要:它包含了你創(chuàng)建多線程應(yīng)用的全部工具,當(dāng)然無(wú)論是還是控制臺(tái)程序。任何想要應(yīng)用在程序里面的多線程應(yīng)用必須都是繼承于這幾個(gè)實(shí)用類(lèi)以上版本取消了類(lèi)。 不分享,做一切! php擁有令人敬畏的且數(shù)量龐大的擴(kuò)展跟特征,但是php當(dāng)初設(shè)計(jì)這門(mén)語(yǔ)言的時(shí)候,是因?yàn)槟莻€(gè)時(shí)候的web網(wǎng)站遠(yuǎn)遠(yuǎn)沒(méi)有今天的強(qiáng)大!現(xiàn)在幾乎所有的網(wǎng)站(含手機(jī)站)服務(wù)器都是多核的,如果不是多CPU跟多核,PHP是無(wú)法提供更好的服務(wù)的。雖...

    heartFollower 評(píng)論0 收藏0
  • Javascript事件循環(huán)入門(mén)到“忘記”(一).md

    摘要:中叫做調(diào)用棧先進(jìn)后出,后進(jìn)先出。如下圖這是典型的內(nèi)存溢出,可能會(huì)出現(xiàn)在某些場(chǎng)景下需要遞歸,但業(yè)務(wù)邏輯中的判斷又沒(méi)能正常計(jì)算進(jìn)入到預(yù)設(shè)情況,于是調(diào)用棧中不斷進(jìn)入,又無(wú)法執(zhí)行完,就造成內(nèi)存溢出了。 本文主要介紹Javascript事件循環(huán)在瀏覽器上的一些特性和應(yīng)用介紹。 Javascript小知識(shí) JavaScript的并發(fā)模型基于事件循環(huán)(Event Loop)。這個(gè)模型與像C或者Jav...

    codeGoogle 評(píng)論0 收藏0
  • Java 性能調(diào)優(yōu)指南之 Java 集合概覽

    摘要:?jiǎn)尉€程集合本部分將重點(diǎn)介紹非線程安全集合。非線程安全集合框架的最新成員是自起推出的。這是標(biāo)準(zhǔn)的單線程陣營(yíng)中唯一的有序集合。該功能能有效防止運(yùn)行時(shí)造型。檢查個(gè)集合之間不存在共同的元素?;谧匀慌判蚧蛘页黾现械淖畲蠡蜃钚≡?。 【編者按】本文作者為擁有十年金融軟件開(kāi)發(fā)經(jīng)驗(yàn)的 Mikhail Vorontsov,文章主要概覽了所有標(biāo)準(zhǔn) Java 集合類(lèi)型。文章系國(guó)內(nèi) ITOM 管理平臺(tái) O...

    gnehc 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<