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

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

第2章-線程安全性

2019-11-11 05:19:07
字體:
來源:轉載
供稿:網友

在構建穩健的并發程序時,必須正確地使用線程和鎖,但這些終歸是一些機制。要編寫線程安全的代碼,其核心在于要對狀態訪問操作進行管理,特別是對共享的(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),一定不要持有鎖。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品va在线| 亚洲成人网av| 精品综合久久久久久97| 亚洲国产精品99| 伊人伊成久久人综合网小说| 九九久久久久99精品| 国产玖玖精品视频| 欧美综合第一页| 亚洲视频专区在线| 色综合五月天导航| 国外成人免费在线播放| 亚洲美女在线观看| 久久人体大胆视频| 亚洲精品综合久久中文字幕| 欧美黑人巨大精品一区二区| 欧美高清无遮挡| 午夜精品99久久免费| 久久久极品av| 日本国产高清不卡| 亚洲天堂第一页| 91理论片午午论夜理片久久| 精品国产乱码久久久久久虫虫漫画| 成人免费大片黄在线播放| 色yeye香蕉凹凸一区二区av| 国产一区二区三区日韩欧美| 国产精品海角社区在线观看| 日本三级韩国三级久久| 精品伊人久久97| 一区二区三区视频免费| 在线播放日韩专区| 国产91色在线播放| 91sao在线观看国产| 日韩极品精品视频免费观看| 欧美有码在线观看| 欧美日韩免费区域视频在线观看| 亚洲人成网站777色婷婷| 欧美日韩人人澡狠狠躁视频| 欧美亚洲国产日韩2020| 成人在线视频福利| 国产午夜精品美女视频明星a级| 深夜福利91大全| 国产精品com| 日韩av在线导航| 成人网欧美在线视频| 欧美影院久久久| 国产不卡精品视男人的天堂| 日韩中文娱乐网| 国产精品久久久久久久久免费| 日韩一级黄色av| 久久男人资源视频| 成人福利网站在线观看| 久久天天躁狠狠躁夜夜躁| 国产精品福利在线观看网址| 亚洲欧美国产高清va在线播| 久久久久久久久久婷婷| 一区二区三区 在线观看视| 成人久久18免费网站图片| 大桥未久av一区二区三区| 亚洲国产精品va在线看黑人| 久久久久久久97| 亚洲成人激情在线| 亚洲欧美在线看| 中文字幕日韩电影| 亚洲午夜女主播在线直播| 中文国产成人精品| 色噜噜狠狠狠综合曰曰曰| 久久国产精品偷| 亚洲人成在线观看网站高清| 亚洲成人黄色网址| 97久久国产精品| 亚洲一区二区免费| 伊人久久大香线蕉av一区二区| 黑人巨大精品欧美一区二区| 国产成人av网址| 久久伊人91精品综合网站| 国产精品久久久久久久久久久不卡| 欧美夫妻性生活视频| 色琪琪综合男人的天堂aⅴ视频| 国产欧美va欧美va香蕉在线| 81精品国产乱码久久久久久| 三级精品视频久久久久| 欧美日韩国产区| 国产精品自产拍在线观看中文| 日韩一区二区在线视频| 亚洲免费视频一区二区| 亚洲字幕在线观看| 欧美福利在线观看| 久久国产精品久久久久久久久久| 蜜月aⅴ免费一区二区三区| 国产欧美一区二区三区视频| 性金发美女69hd大尺寸| 国产美女高潮久久白浆| 亚洲嫩模很污视频| 91免费看国产| 国产精品一区二区在线| 日韩精品免费在线视频观看| 欧洲成人免费aa| 国产精品99蜜臀久久不卡二区| 欧美激情18p| 日韩精品中文字幕有码专区| 日韩欧美福利视频| 亚洲日本aⅴ片在线观看香蕉| 欧美亚洲视频一区二区| 欧美一区二区三区免费视| 日本不卡免费高清视频| 亚洲精品白浆高清久久久久久| 欧美性色xo影院| 精品一区二区三区四区在线| 久久久精品欧美| 欧美一区二区大胆人体摄影专业网站| 成人国产在线视频| www.精品av.com| 中文字幕日韩精品有码视频| 九九精品视频在线| 久久久久久成人精品| 国产精品美女av| 91网站在线免费观看| 亚洲国产第一页| 欧美日韩国产在线看| 日韩精品亚洲元码| 日韩免费电影在线观看| 欧美激情在线有限公司| 欧美人与物videos| 欧美精品激情blacked18| 亚洲毛片在线观看.| 中文字幕亚洲欧美日韩高清| 欧美日韩视频在线| 色偷偷88888欧美精品久久久| 亚洲国内精品在线| 国产97色在线|日韩| 热门国产精品亚洲第一区在线| 亚洲精品电影网在线观看| 国产91精品高潮白浆喷水| 亚洲欧美日本另类| 国产精品久久久久久久久借妻| 日韩一区二区久久久| 夜夜嗨av一区二区三区四区| 欧美第一黄网免费网站| 日韩av理论片| 日韩乱码在线视频| 久久国产精品久久精品| 亚洲国产精品va在看黑人| 日韩经典中文字幕在线观看| 精品国产一区二区三区久久| 国产一区二区美女视频| 黑人巨大精品欧美一区二区免费| 久久国产精品久久久久久久久久| 久久亚洲影音av资源网| 久久好看免费视频| 高清欧美性猛交xxxx黑人猛交| 宅男66日本亚洲欧美视频| 国产亚洲精品久久久久久牛牛| 一区二区三区黄色| 亚洲欧美日韩在线一区| 日韩av电影在线免费播放| 九九视频这里只有精品| 国产精品久久久久久久久久| 日韩在线观看免费高清| 久久久久久久久久久久av| 欧美福利小视频| 国产精品无码专区在线观看| 51精品国产黑色丝袜高跟鞋| 欧美猛交免费看| 日本成人黄色片|