摘要:門的定義人的定義執行結果分析可以看到,上述類并非線程安全的,因為方法會被多個線程同時調用,且該方法中會修改類字段的值。
一、定義
Single Threaded Execution 是指“以1個線程執行”的意思,有時也稱為Critical Section(臨界區)。
二、模式案例案例:
假設有三個人,頻繁地通過一扇門,規定每次只能通過一個人,當通過一個人時,程序會將通過的總人次加1,同時記錄該次通過人的姓名和出生地。
門的定義:
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); } } } ?``` *執行:*
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(); }
}
?`
結果:
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類并非線程安全的,因為pass方法會被多個線程同時調用,且該方法中會修改Gate類字段的值。
優化:
//將Gate類變為線程安全的類: 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——從多個線程同時調用也不會發生問題的方法 ②UnsafeMethod——從多個線程同時調用會發生問題,這類方法需要加以防護,指定只能由單線程訪問區域,即臨界區(critical section)。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71488.html
摘要:介紹網絡性能評估主要是監測網絡帶寬的使用率,將網絡帶寬利用最大化是保證網絡性能的基礎,但是由于網絡設計不合理網絡存在安全漏洞等原因,都會導致網絡帶寬利用率不高。 介...
摘要:總之,選擇單例模式就是為了避免不一致狀態,避免政出多頭。二餓漢式單例餓漢式單例類在類初始化時,已經自行實例化靜態工廠方法餓漢式在類創建的同時就已經創建好一個靜態的對象供系統使用,以后不再改變,所以天生是線程安全的。 概念: Java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這里主要介紹兩種:懶漢式單例、餓漢式單例。 單例模式有以下特點: 1、單例類只能有一個實例。 ...
摘要:它包含了你創建多線程應用的全部工具,當然無論是還是控制臺程序。任何想要應用在程序里面的多線程應用必須都是繼承于這幾個實用類以上版本取消了類。 不分享,做一切! php擁有令人敬畏的且數量龐大的擴展跟特征,但是php當初設計這門語言的時候,是因為那個時候的web網站遠遠沒有今天的強大!現在幾乎所有的網站(含手機站)服務器都是多核的,如果不是多CPU跟多核,PHP是無法提供更好的服務的。雖...
摘要:中叫做調用棧先進后出,后進先出。如下圖這是典型的內存溢出,可能會出現在某些場景下需要遞歸,但業務邏輯中的判斷又沒能正常計算進入到預設情況,于是調用棧中不斷進入,又無法執行完,就造成內存溢出了。 本文主要介紹Javascript事件循環在瀏覽器上的一些特性和應用介紹。 Javascript小知識 JavaScript的并發模型基于事件循環(Event Loop)。這個模型與像C或者Jav...
摘要:單線程集合本部分將重點介紹非線程安全集合。非線程安全集合框架的最新成員是自起推出的。這是標準的單線程陣營中唯一的有序集合。該功能能有效防止運行時造型。檢查個集合之間不存在共同的元素。基于自然排序或找出集合中的最大或最小元素。 【編者按】本文作者為擁有十年金融軟件開發經驗的 Mikhail Vorontsov,文章主要概覽了所有標準 Java 集合類型。文章系國內 ITOM 管理平臺 O...
閱讀 2351·2021-11-25 09:43
閱讀 2864·2021-11-24 09:39
閱讀 2926·2019-08-30 11:10
閱讀 1130·2019-08-29 16:34
閱讀 595·2019-08-29 13:25
閱讀 3358·2019-08-29 11:21
閱讀 2861·2019-08-26 11:39
閱讀 2394·2019-08-26 11:34