Java線程之多線程與多進程(2)——線程優先級與線程安全

線程優先級

現在主流操作系統(如Windows、Linux、Mac OS X)的任務調度除了具有前面提到的時間片輪轉的特點外,還有優先級調度(Priority Schedule)的特點。優先級調度決定了線程按照什么順序輪流執行,在具有優先級調度的系統中,線程擁有各自的線程優先級(Thread Priority)。具有高優先級的線程會更早地執行,而低優先級的線程通常要等沒有更高優先級的可執行線程時才會被執行。

線程的優先級可以由用戶手動設置,此外系統也會根據不同情形調整優先級。通常情況下,頻繁地進入等待狀態(進入等待狀態會放棄之前仍可占用的時間份額)的線程(如IO線程),比頻繁進行大量計算以至于每次都把所有時間片全部用盡的線程更受操作系統的歡迎。因為頻繁進入等待的線程只會占用很少的時間,這樣操作系統可以處理更多的任務。我們把頻繁等待的線程稱之為IO密集型線程(IO Bound Thread),而把很少等待的線程稱之為CPU密集型線程(CPU Bound Thread)。IO密集型線程總是比CPU密集型線程更容易得到優先級的提升。

線程餓死:

在優先級調度下,容易出現一種線程餓死的現象。一個線程餓死是說它的優先級較低,在它執行之前總是有比它優先級更高的線程等待執行,因此這個低優先級的線程始終得不到執行。當CPU密集型的線程優先級較高時,其它低優先級的線程就很可能出現餓死的情況;當IO密集型線程優先級較高時,其它線程相對不容易造成餓死,因為IO線程有大量的等待時間。為了避免線程餓死,調度系統通常會逐步提升那些等待了很久而得不到執行的線程的優先級。這樣,一個線程只要它等待了足夠長的時間,其優先級總會被提升到可以讓它執行的程度,也就是說這種情況下線程始終會得到執行,只是時間的問題。

在優先級調度環境下,線程優先級的改變有三種方式:?
1. 用戶指定優先級;?
2. 根據進入等待狀態的頻繁程度提升或降低優先級(由操作系統完成);?
3. 長時間得不到執行而被提升優先級。

線程安全與鎖

?在多個線程并發執行訪問同一個數據時,如果不采取相應的措施,將會是非常危險的。假設你在工行有一個銀行賬戶,兩張銀聯卡(自己手里一張,女朋友手里一張),里面有100萬。假設取錢就兩個過程:1.檢查賬戶余額,2.取出現金(如果要取出的金額 > 賬戶余額,則取現成功,否則取現失敗)。有一天你要買房想把錢取出來,而此時你女朋友也想買一輛車(假設你們事先沒有商量)。兩個人都在取錢,你在A號ATM機取100萬,女朋友在B號ATM機取80萬。這時A號ATM檢查賬戶余額發現有100萬,可以取出;而與此同時,同一時刻B號ATM也在檢查賬戶余額發現有100萬,可以取出;這樣,A、B都把錢取出來了。

????100萬的存款取出180萬,銀行就虧大發了(當然你就笑呵呵了……)!這就是線程并發的不安全性。為避免這種情況發生,我們要將多個線程對同一數據的訪問同步,確保線程安全。

????????所謂同步(synchronization)就是指一個線程訪問數據時,其它線程不得對同一個數據進行訪問,即同一時刻只能有一個線程訪問該數據,當這一線程訪問結束時其它線程才能對這它進行訪問。同步最常見的方式就是使用鎖(Lock),也稱為線程鎖。鎖是一種非強制機制,每一個線程在訪問數據或資源之前,首先試圖獲取(Acquire)鎖,并在訪問結束之后釋放(Release)鎖。在鎖被占用時試圖獲取鎖,線程會進入等待狀態,直到鎖被釋放再次變為可用。

二元信號量

(多元)信號量

互斥量

臨界區

讀寫鎖

僅允許一個線程訪問(可越俎代庖允許多個線程訪問同一個資源僅允許一個線程訪問(不可越俎代庖)僅限于本進程允許多個線程同時對同一個數據進行讀操作,而只允許一個線程進行寫操作
兩種狀態:占用和非占用???兩種獲取方式:共享的(Shared)和獨占的(Exclusive)

二元信號量

二元信號量(Binary Semaphore)是一種最簡單的鎖,它有兩種狀態:占用和非占用。它適合只能被唯一一個線程獨占訪問的資源。當二元信號量處于非占用狀態時,第一個試圖獲取該二元信號量鎖的線程會獲得該鎖,并將二元信號量鎖置為占用狀態,之后其它試圖獲取該二元信號量的線程會進入等待狀態,直到該鎖被釋放。

信號量

多元信號量允許多個線程訪問同一個資源,多元信號量簡稱信號量(Semaphore),對于允許多個線程并發訪問的資源,這是一個很好的選擇。一個初始值為N的信號量允許N個線程并發訪問。線程訪問資源時首先獲取信號量鎖,進行如下操作:?
1. 將信號量的值減1;?
2. 如果信號量的值小于0,則進入等待狀態,否則繼續執行;?
訪問資源結束之后,線程釋放信號量鎖,進行如下操作:?
1. 將信號量的值加1;?
2. 如果信號量的值小于1(等于0),喚醒一個等待中的線程;

互斥量

互斥量(Mutex)和二元信號量類似,資源僅允許一個線程訪問。與二元信號量不同的是,信號量在整個系統中可以被任意線程獲取和釋放,也就是說,同一個信號量可以由一個線程獲取而由另一線程釋放。而互斥量則要求哪個線程獲取了該互斥量鎖就由哪個線程釋放,其它線程越俎代庖釋放互斥量是無效的。? ??

臨界區

臨界區(Critical Section)是一種比互斥量更加嚴格的同步手段。互斥量和信號量在系統的任何進程都是可見的,也就是說一個進程創建了一個互斥量或信號量,另一進程試圖獲取該鎖是合法的。而臨界區的作用范圍僅限于本進程,其它的進程無法獲取該鎖。除此之處,臨界區與互斥量的性質相同。

讀寫鎖

讀寫鎖(Read-Write Lock)允許多個線程同時對同一個數據進行讀操作,而只允許一個線程進行寫操作。這是因為讀操作不會改變數據的內容,是安全的;而寫操作會改變數據的內容,是不安全的。對同一個讀寫鎖,有兩種獲取方式:共享的(Shared)和獨占的(Exclusive)。當鎖處于自由狀態時,試圖以任何一種方式獲取鎖都能成功,并將鎖置為對應的狀態;如果鎖處于共享狀態,其它線程以共享方式獲取該鎖,仍然能成功,此時該鎖分配給了多個線程;如果其它線程試圖如獨占的方式獲取處于共享狀態的鎖,它必須等待所有線程釋放該鎖;處于獨占狀態的鎖阻止任何線程獲取該鎖,不論它們以何種方式。獲取讀寫鎖的方式總結如下:

讀寫鎖的狀態以共享方式(Shared)獲取以獨占方式(Exclusive)獲取
自由成功成功
共享成功等待
獨占等待等待

表 1 :獲取讀寫鎖的方式


----------------------------------------結束----->僅供學習

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274021.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274021.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274021.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mahout貝葉斯算法開發思路(拓展篇)1

首先說明一點,此篇blog解決的問題是就下面的數據如何應用mahout中的貝葉斯算法?(這個問題是在上篇(。。。完結篇)blog最后留的問題,如果想直接使用該工具,可以在mahout貝葉斯算法拓展下載&#…

Java線程之多線程與多進程(3)——Java中的多線程

單線程 任何程序至少有一個線程,即使你沒有主動地創建線程,程序從一開始執行就有一個默認的線程,被稱為主線程,只有一個線程的程序稱為單線程程序。如下面這一簡單的代碼,沒有顯示地創建一個線程,程序從mai…

幾種常用控件的使用方法

1.UIActivityIndicatorView的使用 UIActivityIndicatorView *activity[[[UIActivityIndicatorViewalloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]autorelease]; z [activity setFrame:CGRectMake(150,150, 50, 50)]; [self.window addSubview:activ…

Java-正則表達式

什么是正則表達式? 正則表達式(Regular Expression)就是用某種模式去匹配一類字符串的公式。如你要在一篇文章中查找第一個字是“李”最后一個字是“建”的三個字的姓名,即“李*建”;那么“李*建”就是公式,也稱作模式(Pattern)&a…

tab標簽的另一種寫法

<div class"good"><ul><li><span>歌曲精選</span></li><li class"other"><span>MV精選</span></li></ul><div class"music_good"><p><span>丁當</span…

java 中 if與while的區別

if&#xff1a;就是一個判斷的&#xff0c;如果滿足后面的條件就繼續運行if語句里面的東西的&#xff0c;要是不滿足就跳出來&#xff0c;執行else語句或執行下面的語句的 。while&#xff1a;就是循環語句的&#xff0c;當滿足while里面的條件時&#xff0c;就會執行里面的循環…

install yael on the ubuntu 12.04

1. bits/predefs.h no such file or directory ??? sudo apt-get install gcc-multilib 2. sudo gedit /etc/profile PATH$PATH:/usr/local/MATLAB/R2012a/bin source /etc/profile 3.ubuntu 切換gcc 版本 1&#xff09;sudo apt-get install gcc-4.4 g-4.4 g-4.4-multi…

Java 線程多線程編程3---線程同步之生產者與消費者問題

生產者與消費者問題&#xff1a; 第一步&#xff1a;把架子搭起來 package com.zhj.www;public class ProceduerConsumer {public static void main(String[] args) {} }//饅頭實體 class wotou{int id;wotou(int id) {this.id id;}public String toString() {return "wo…

windows 服務實例

參考來源:http://blog.csdn.net/morewindows/article/details/6858216 參考來源: http://hi.baidu.com/tfantasy/item/aefa43d66b470a2b38f6f76c 剩下的都是我自己整理的。 在VS2012中新建一個Windows 服務的項目。然后在解決方案目錄下找到Services1.cs&#xff0c;切換到代碼…

Java 線程多線程編程2---線程同步

來模擬一個死鎖&#xff08;互相等待&#xff09;&#xff1a; TestDeadLock.java package com.zhj.www;public class TestDeadLock implements Runnable {public int flag 1;static Object o1 new Object();static Object o2 new Object();public void run() {System.out.p…

Java網絡編程1---基礎

TCP/IP:事實上的標準 自己編的應用程序&#xff1a;應用層 TCP/UDP層 IP層 物理層 數據封裝&#xff1a;第五層只與第四層打交道。 數據拆封《TCP/IP詳解》網絡底層 IP巨大的貢獻&#xff1a;提供了獨一無二的IP地址。 內網IP&#xff1a;虛假的 子網掩碼&#xff1a;255.255.2…

Java網絡編程2---Socket-TCP編程

Sockct:插座Socket是關于TCP的。 端口號&#xff1a;兩個字節->65536個端口號&#xff0c;一個應用程序占多個端口號&#xff1b; 但是假設一個應用程序占一個端口號&#xff1b;一臺電腦會有65535個應用程序。 自己編寫程序要占用端口號1024以上后的。 80端口&#xff1a;網…

winform綁定多張圖片

開發winform程序的時候經常設計到要顯示多張圖片的問題&#xff0c;其解決思路一般是先遍歷文件夾中的所有圖片&#xff0c;然后再把這些圖片添加到ImageList控件中&#xff0c;最后再綁定顯示出來。這里我們介紹兩種綁定的方法&#xff1a; &#xff08;一&#xff09;動態生成…

Java網絡編程3---Socket-UDP編程

栗子&#xff1a;TestUDPServer.java 服務器端&#xff1a; package com.zhj.www;import java.net.DatagramPacket; import java.net.DatagramSocket;public class TestUDPServer {public static void main(String[] args)throws Exception {byte buf[] new byte[1024];Datagr…

iOS 6 自動布局入門

http://www.raywenderlich.com/zh-hans/22873/ios-6-自動布局-入門&#xff0d;1轉載于:https://www.cnblogs.com/ihojin/p/auto-layout.html

Java GUI 基礎知識

這部分主要包含AWT、組件和容器、布局管理器Component&#xff1a;所有可以和用戶交互的圖形元素&#xff0c;他的子類有&#xff1a;輸入框… Java.awt及其子包 Container&#xff1a;容器&#xff0c;容納其他各種各樣的Component的元素。 Panel&#xff1a;可以容納其他元素…

UVA11300

初步解題原理:代數運算單元素極值 代數運算: xi表示第i個給i-1的數量&#xff0c;正負表示給或得 c(a1a2a3....an)/n a1-x1x2c -->x2x1-a1c a2-x2x3c -->x3x1-a1-a22c a3-x3x4c -->x4x1-a1-a2-a33c ...... an-xnx1c -->xnx1-a1-a2-a3....-a(n-1)(n-1)c ansmax{|x1|…

Java GUI 基礎知識2 監聽機制

TestActionEvent.java沒有調用方法&#xff0c;但是有反應。反應自己要編寫程序有反應。 事件模型&#xff1a;一定要有某些反應。 寫程序&#xff0c;監聽的操作是自動發生的&#xff0c;一直監聽。鉤子函數&#xff0c;&#xff08;回調函數&#xff09; 怎么讓它自動執行&am…

求字符串的最長回文字串 O(n)

昨天參加了某公司的校園招聘的筆試題&#xff0c;做得慘不忍睹&#xff0c;其中就有這么一道算法設計題&#xff1a;求一個字符串的最長回文字串。我在ACM校隊選拔賽上遇到過這道題&#xff0c;當時用的后綴數組AC的&#xff0c;但是模板忘了沒寫出代碼來。 回頭我把這道題目再…

數據結構 二、向量(接口與實現and可擴容向量)

ADT操作實例&#xff1a;Disordered&#xff1a;顯示出3對逆序緊鄰對。Vector模板類初始有效空間為0&#xff1b;基于復制的構造描述區間&#xff1a;左閉右開 為什么*2&#xff1f;有限時間內不必要為擴容而打斷。 2、可擴充向量左移一位&#xff1a;加一倍