摘要:門的定義人的定義執(zhí)行結(jié)果分析可以看到,上述類并非線程安全的,因?yàn)榉椒〞欢鄠€線程同時調(diào)用,且該方法中會修改類字段的值。
一、定義
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)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71488.html
摘要:介紹網(wǎng)絡(luò)性能評估主要是監(jiān)測網(wǎng)絡(luò)帶寬的使用率,將網(wǎng)絡(luò)帶寬利用最大化是保證網(wǎng)絡(luò)性能的基礎(chǔ),但是由于網(wǎng)絡(luò)設(shè)計不合理網(wǎng)絡(luò)存在安全漏洞等原因,都會導(dǎo)致網(wǎng)絡(luò)帶寬利用率不高。 介...
摘要:總之,選擇單例模式就是為了避免不一致狀態(tài),避免政出多頭。二餓漢式單例餓漢式單例類在類初始化時,已經(jīng)自行實(shí)例化靜態(tài)工廠方法餓漢式在類創(chuàng)建的同時就已經(jīng)創(chuàng)建好一個靜態(tài)的對象供系統(tǒng)使用,以后不再改變,所以天生是線程安全的。 概念: Java中單例模式是一種常見的設(shè)計模式,單例模式的寫法有好幾種,這里主要介紹兩種:懶漢式單例、餓漢式單例?! 卫J接幸韵绿攸c(diǎn): 1、單例類只能有一個實(shí)例?!?..
摘要:它包含了你創(chuàng)建多線程應(yīng)用的全部工具,當(dāng)然無論是還是控制臺程序。任何想要應(yīng)用在程序里面的多線程應(yīng)用必須都是繼承于這幾個實(shí)用類以上版本取消了類。 不分享,做一切! php擁有令人敬畏的且數(shù)量龐大的擴(kuò)展跟特征,但是php當(dāng)初設(shè)計這門語言的時候,是因?yàn)槟莻€時候的web網(wǎng)站遠(yuǎn)遠(yuǎn)沒有今天的強(qiáng)大!現(xiàn)在幾乎所有的網(wǎng)站(含手機(jī)站)服務(wù)器都是多核的,如果不是多CPU跟多核,PHP是無法提供更好的服務(wù)的。雖...
摘要:中叫做調(diào)用棧先進(jìn)后出,后進(jìn)先出。如下圖這是典型的內(nèi)存溢出,可能會出現(xiàn)在某些場景下需要遞歸,但業(yè)務(wù)邏輯中的判斷又沒能正常計算進(jìn)入到預(yù)設(shè)情況,于是調(diào)用棧中不斷進(jìn)入,又無法執(zhí)行完,就造成內(nèi)存溢出了。 本文主要介紹Javascript事件循環(huán)在瀏覽器上的一些特性和應(yīng)用介紹。 Javascript小知識 JavaScript的并發(fā)模型基于事件循環(huán)(Event Loop)。這個模型與像C或者Jav...
摘要:單線程集合本部分將重點(diǎn)介紹非線程安全集合。非線程安全集合框架的最新成員是自起推出的。這是標(biāo)準(zhǔn)的單線程陣營中唯一的有序集合。該功能能有效防止運(yùn)行時造型。檢查個集合之間不存在共同的元素?;谧匀慌判蚧蛘页黾现械淖畲蠡蜃钚≡?。 【編者按】本文作者為擁有十年金融軟件開發(fā)經(jīng)驗(yàn)的 Mikhail Vorontsov,文章主要概覽了所有標(biāo)準(zhǔn) Java 集合類型。文章系國內(nèi) ITOM 管理平臺 O...
閱讀 2362·2021-11-25 09:43
閱讀 2870·2021-11-24 09:39
閱讀 2936·2019-08-30 11:10
閱讀 1143·2019-08-29 16:34
閱讀 606·2019-08-29 13:25
閱讀 3367·2019-08-29 11:21
閱讀 2869·2019-08-26 11:39
閱讀 2401·2019-08-26 11:34