亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

第2章-線程安全性

2019-11-11 06:31:14
字體:
來源:轉載
供稿:網友

在構建穩健的并發程序時,必須正確地使用線程和鎖,但這些終歸是一些機制。要編寫線程安全的代碼,其核心在于要對狀態訪問操作進行管理,特別是對共享的(Shared)和可變的(Mutable)狀態的訪問。

從非正式的意義上說,對象的狀態是指存儲在狀態變量(例如實例或靜態域)中的數據。對象的狀態可能包括其他依賴對象的域,比如某個HashMap的狀態不僅存儲在HashMap對象本身,還存儲在許多Map.Entry對象中。

共享 意味著變量可以由多個線程同時訪問 可變 意味著變量的值在其生命周期內可以發生變化

一個對象是否需要是線程安全的,取決于它是否被多個線程訪問。

當多個線程訪問某個狀態變量并且其中有一個線程執行寫入操作(說明是是共享 可變的)時,必須采用同步機制來協同這些線程對變量的訪問。(保證線程安全性)

java中主要的同步機制:

synchronizedvolatile類型的變量顯式鎖(Explicit Lock)原子變量

變量為線程安全的方法組合:

不共享共享+不可變共享+可變+同步

程序狀態的封裝性越好,就越容易實現程序的線程安全性,并且代碼的維護人員也越容易保持這種方式。

線程安全的程序不一定完全由線程安全類構成。(可以有非線程安全類,然后在程序中增加同步措施) 完全由線程安全類構成的程序并不一定就是線程安全的。(兩個線程安全類不同鎖,構成的程序不能保證原子性) 線程安全類中也可以包含非線程安全的類(同上,只要再增加同步措施即可)

線程安全性定義:當多個線程訪問某個類時,不管運行時環境采用何種調度方式或者這些線程如何交替執行,并且在主調代碼中不需要任何額外的同步或協同,這個類始終都能表現出正確的行為,那么就稱這個類是線程安全的。正確性的含義是,某個類的行為與其規范一致。(如果你覺得‘正確性’的定義有些模糊,那么可以將線程安全類認為是一個在并發環境和單線程環境中都不會被破壞的類)

通常,線程安全性的需求并非來源于對線程的直接使用,而是使用像Servlet這樣的框架。

無狀態對象一定是線程安全的。

競態條件(Race Condition):由于不恰當的執行時序而出現了不正確的結果(出現這種狀況則不是線程安全的,因為違反了線程安全性的定義)。當某個計算的正確性取決于多個線程的交替執行時序時,那么就會發生競態條件,換句話說,就是正確的結果取決于運氣。

數據競爭(Data Race):如果在訪問共享的非final類型的域(共享 可變)時沒有采用同步來進行協同,那么就會出現數據競爭。在java內存模型中,如果在代碼中存在數據競爭,那么這段代碼就沒有確定的語義。

并非所有的競態條件都是數據競爭,同樣并非所有的數據競爭都是競態條件。???

競態條件的類型:

讀取-修改-寫入(++count 操作并非原子,結果狀態依賴于之前的狀態)先檢查后執行(Check-Then-Act,通過一個可能失效的觀測結果來做出判斷或者執行某個計算)

使用“先檢查后執行”的一種常見情況就是延遲初始化。延遲初始化的母的:

將對象的初始化操作推遲到實際被使用時才進行確保只被初始化一次。

與大多數并發錯誤一樣,競態條件并不總是產生錯誤,還需要某種不恰當的執行時序。

要避免競態條件問題,就必須在某個線程修改該變量時,通過某種方式防止其他線程使用這個變量。也就是說必須原子操作來避免產生競態條件。

原子操作:對于訪問同一個狀態的所有操作(包括該操作本身)來說,這個操作 一個 以原子方式執行的操作。

如果++count是一個原子操作,那么競態條件就不會發生。 使++count不會發生競態條件的方法

加鎖,確保原子性使用線程安全類,將count聲明為AtomicLong類型

當在無狀態的類中添加一個狀態時,如果該狀態完全由線程安全的對象來管理,那么這個類仍然是線程安全的。(0 –> 1 當0/1變多時,并不是這么簡單)

當一個類引入了多個狀態變量時,狀態變量之間可能不是彼此獨立的,而是某個變量的值會對其他變量的值產生約束,這時,要保持狀態的一致性(也就是保證線程安全),就需要在單個原子操作中更新所有相關的狀態變量。

同步機制的兩個重要方面:

原子性可見性

同步代碼塊包含兩部分:

作為鎖的對象引用作為由這個鎖保護的代碼塊

每個java對象都可以用作一個實現同步的鎖,這些鎖被稱為內置鎖(Intrinsic Lock)或者監視器鎖(Monitor Lock)。線程在進入同步代碼塊之前會自動獲得鎖,并且在退出同步代碼塊時自動釋放鎖,而無論是通過正常的控制路徑退出,還是通過從代碼塊中拋出異常退出獲得內置鎖的唯一途徑就是進入由這個鎖保護的同步代碼塊或方法。

java的內置鎖相當于一種互斥體(或互斥鎖 mutex),這意味著最多只有一個線程能夠持有這種鎖。

并發環境中的原子性與實務應用程序中的原子性有著相同的含義———一組語句作為一個不可分割的單元被執行。

內置鎖是可重入的(reentrant),也就是說如果某個線程試圖獲得一個已經由他自己持有的鎖,那么這個請求就會成功。“重入”意味著獲取鎖的操作粒度是“線程”,而不是“調用”(這與pthread(POSIX線程)互斥體的默認加鎖行為不同,pthread互斥體的獲取操作是以“調用”為粒度的)。

重入進一步提升了加鎖行為的封裝性。在java中子類改寫父類synchronized方法,然后在其中調用父類的方法,如果沒有可重入的鎖,那么這段代碼將產生死鎖。

對于可能被多個線程同時訪問的可變狀態變量,在訪問它時需要持有同一個鎖,在這種情況下,我們稱狀態變量是由這個鎖保護的。

一種常見的加鎖約定是,將所有的可變狀態都封裝在對象內部,并通過對象的內置鎖對所有訪問可變狀態的代碼路徑進行同步,使得在該對象上不會發生并發訪問。

對于包含多個變量的不變性條件,其中涉及的所有變量都需要由同一個鎖來保護。

如果同步可以避免競態條件的問題,那么為什么不在每個方法聲明時都是用關鍵字synchronized?

如果不加區別的濫用synchronized,可能導致程序中出現過多的同步如果只是將每個方法都作為同步方法,那么并不足以確保Vector上復合操作都是原子的,比如在程序代碼中使用Vector:if(!vector.contains(element)) vector.add(element);

contains和add方法均為syn方法,但是上面這段代碼為先檢查后執行,存在競態條件,需要將這兩個操作合并為復合操作。

不良并發(Poor concurrency)應用程序:可同時調用的數量不僅受到可用處理資源的限制,還受到應用程序本身結構的限制。

縮小同步代碼塊的作用范圍,可以確保程序的并發性,同時又維護線程安全性。但是,如果將同步代碼塊分解的過細,那么在獲取鎖與釋放鎖等操作上都需要一定的開銷。

當執行時間較長的計算或者可能無法快速完成的操作時(例如,網絡I/O或者控制臺I/O),一定不要持有鎖。


上一篇:poj 1661

下一篇:ZCMU-Problem E - Ones

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区三区高清国产| 久久久久久久97| 国产日韩欧美夫妻视频在线观看| 欧美激情视频一区二区| 久久久在线视频| 国内精品中文字幕| 中文字幕欧美日韩精品| 亚洲欧美日韩中文在线| 国产成人精品av| 日韩在线观看免费全| 国产亚洲精品久久久久久777| 日本亚洲欧美成人| 午夜免费久久久久| 亚洲欧洲国产一区| 成人免费视频网| www.国产精品一二区| 日韩av电影在线网| 久久成年人视频| 最近2019免费中文字幕视频三| 精品调教chinesegay| 2021国产精品视频| 国产一级揄自揄精品视频| 中文字幕一区二区三区电影| 欧美日韩成人在线观看| 日本中文字幕久久看| 久久免费高清视频| 欧美日韩国产黄| 国产精品第一第二| 亚洲精品久久久久中文字幕二区| 国产日韩欧美在线| 亚洲xxxx3d| 亚洲精品www久久久久久广东| 亚洲国产99精品国自产| 亚洲精品国精品久久99热一| 亚洲免费一在线| 久久久影视精品| 91av视频在线观看| 国产成人亚洲精品| 91久久精品视频| 国产情人节一区| 欧美色播在线播放| 久久精品国产久精国产一老狼| 久久精品久久久久| 亚洲iv一区二区三区| 91热精品视频| 午夜精品福利在线观看| 91久热免费在线视频| 欧美成人精品在线观看| 日韩在线观看高清| 欧美老肥婆性猛交视频| 亚洲国产成人爱av在线播放| 国产日韩精品在线| 精品自在线视频| 亚洲精品综合久久中文字幕| 色综合男人天堂| 青青久久av北条麻妃黑人| 久久国产精品99国产精| 欧美中文字幕视频| 亚洲精品国产精品自产a区红杏吧| 欧美性猛交xxxx乱大交3| 日韩高清电影免费观看完整| 成人在线一区二区| 亚洲第一av网站| 亚洲电影av在线| 亚洲欧美精品一区二区| 另类专区欧美制服同性| 亚洲成人xxx| 欧美性极品xxxx做受| 久久久精品国产网站| 亚洲国产成人精品久久久国产成人一区| 国产精品久久久久av| 亚洲精品国产精品国自产观看浪潮| 国产伊人精品在线| 久久久亚洲影院你懂的| 欧美日本黄视频| 成人女保姆的销魂服务| 全亚洲最色的网站在线观看| 亚洲成人黄色网| 日韩在线观看免费av| 久久久中精品2020中文| 奇米一区二区三区四区久久| 国产精品自在线| 久久深夜福利免费观看| 日韩在线中文视频| 欧美色欧美亚洲高清在线视频| 热re99久久精品国产66热| 久久久国产精品视频| 国产噜噜噜噜久久久久久久久| 日本久久91av| 中文字幕在线国产精品| 国语自产精品视频在线看一大j8| 中文字幕日韩在线观看| 国产精品久久久久久久av大片| 98精品国产高清在线xxxx天堂| 国产精品久久久久久久久| 久久成人国产精品| 欧美日韩在线观看视频小说| 97免费视频在线播放| 成人写真福利网| 久久久久中文字幕2018| 欧美性猛交xxxx乱大交3| 国产一区二区三区直播精品电影| 欧美成人午夜激情视频| 成人黄色中文字幕| 91麻豆国产语对白在线观看| 一本色道久久88亚洲综合88| 国产一区二区三区毛片| 日韩最新免费不卡| 57pao国产成人免费| 欧美激情va永久在线播放| 国产成人精品av| 国产一区二区三区视频免费| 国产精品91久久| 欧美性猛交xxxxx水多| 亚洲四色影视在线观看| 欧美激情第99页| 久久亚洲欧美日韩精品专区| 国产人妖伪娘一区91| 欧美激情按摩在线| 51久久精品夜色国产麻豆| 久久精品久久精品亚洲人| 亚洲欧洲午夜一线一品| 亚洲成人久久久| 最新国产精品拍自在线播放| 久久影视电视剧免费网站| 亚洲国产精品99久久| 亚洲人a成www在线影院| 国产成人福利夜色影视| 欧美电影电视剧在线观看| 91美女福利视频高清| 亚洲久久久久久久久久久| 亚洲精品在线观看www| 亚洲欧美激情在线视频| 精品一区二区三区电影| 亚洲欧洲午夜一线一品| 大伊人狠狠躁夜夜躁av一区| 日韩天堂在线视频| 欧美孕妇性xx| 中文字幕亚洲欧美在线| 亚洲有声小说3d| 日韩av高清不卡| 国产一区私人高清影院| 综合激情国产一区| 亚洲视频自拍偷拍| 97久久超碰福利国产精品…| 国产成人涩涩涩视频在线观看| 日韩亚洲欧美中文高清在线| 国产91精品久久久| 国产精品爱啪在线线免费观看| 91在线精品视频| 日本精品免费一区二区三区| 亚洲免费中文字幕| 国产成人精品免费视频| 色综合视频一区中文字幕| 国产亚洲精品91在线| 米奇精品一区二区三区在线观看| 岛国av一区二区在线在线观看| 欧美国产日韩一区二区| 亚洲精品美女在线观看播放| 欧美在线视频网| 91精品国产色综合久久不卡98| 国产精品久久久久免费a∨大胸| 久久精品亚洲一区| 国产精品日韩在线一区|