欧美日韩激情_美女国产一区_国产精品久久久久影院日本_69xxx在线

Java傳統編程模型存在的問題

2021-02-27    分類: 網站建設

Actor模型不僅僅被認為是一種高效的解決方案 ,它已經在世界上一些要求最苛刻的應用中得到了驗證,為了突出Actor模型所解決的問題,本節首先討論傳統編程模型與現代多線程和多CPU的硬件架構之間的不匹配:

  • 對面向對象中封裝(encapsulation)特性的挑戰
  • 對共享內存在現代計算機架構上的誤解
  • 對調用堆棧的誤解

對封裝特性的挑戰

封裝(encapsulation)是面向對象編程(OOP)中的一大特性,封裝意味著對象內部的數據不能夠在對象外直接訪問,必須通過對象提供的一系列方法來間接進行訪問。對象負責公開對數據的安全操作的方法,以保護其封裝的數據的不變性。

在多線程下,多個線程同時調用同一個對象的方法來修改其內部封裝的數據時候,就會存在線程安全問題,這是因為封裝本身不確保對象內部數據的一致性,在不對對象的方法在修改數據施加一定同步措施時,對象內的數據就會在多線程訪問下變得不確定了。

一個解決該問題的方式就是,多線程訪問對象方法內數據時候施加一定同步措施,比如加鎖,加鎖可以保證同時只有一個線程可以訪問對象內的數據,但是加鎖會帶來昂貴的代價:

  • 使用鎖會嚴重影響并發度,使用鎖在現在CPU架構中是一個比較昂貴的操作,因為當線程獲取鎖失敗后會把線程從用戶態切換到內核態把線程掛起,稍后喚醒后又需要從內核態切換到用戶態進行運行。
  • 獲取鎖失敗的調用線程會被阻塞掛起,因此它不能做任何有意義的事情。即使在桌面應用程序中這也是不可取的,我們想要的是即使后臺有一個運行比較耗時的工作在運行,也要保證系統對用戶的一部分請求有響應。在后端應用中,阻塞是完全浪費資源的。另外可能有人認為雖然當前線程阻塞了,但是我們可以通過啟動新線程來彌補這一點,但是需要注意一點,線程也是一種昂貴的資源,操作系統對線程個數是有限制的。
  • 另外鎖的存在,帶來了新的威脅,即死鎖問題的存在。

由于以上問題的存在,導致我們進退兩難:

  • 如果不使用足夠的鎖,則不能保證多線程下對象中數據不受到破壞。
  • 如果在對象中每個數據訪問是都加了鎖,則會導致系統性能下降,并且很容易導致死鎖的發生。

另外,鎖只能在單JVM內(本地鎖)很好的工作。當涉及到跨多臺機協調時,只能使用分布式鎖。但是分布式鎖的效率比本地鎖低幾個數量級,這是因為分布式鎖協議需要跨多臺機在網絡上進行多次往返通信,所以其造成較大的影響就是延遲。

小結:

  • 對象只能在單線程情況下保證封裝的安全性,也就是保證對象封裝的數據的線程安全性。多線程下修改對象內的數據大多情況下會導致數據被污染,造成臟數據產生。在同一代碼段中有兩個競爭線程會導致違反每個不變式。
  • 雖然鎖看起來是保證多線程下封特性比較直接的方式,但實際上使用鎖的效率低下,并且在任何實際規模的應用中都容易導致死鎖的產生。
  • 本地鎖是我們經常使用的,但是如果嘗試將其擴展為分布式鎖,則是有代價的,并且其橫向擴展的潛力有限。

對共享內存在現代計算機架構上的誤解

在80-90年代的編程模型概念化地表示,寫入變量時候是直接把其值寫入主內存里面(這有點混淆了局部變量可能只存在于cpu寄存器中的事實)。在現在計算機硬件架構中,計算機系統中為了解決主內存與CPU運行速度的差距,在CPU與主內存之間添加了一級或者多級高速緩沖存儲器(Cache),每個cache有好多cache行組成,這些Cache一般是集成到CPU內部的,所以也叫 CPU Cache。所以當我們寫入變量的時候實際是寫入到了當前cpu的Cache中,而不是直接寫入到主內存中,并且當前cpu核對自己cache寫入的變量對其他cpu核是不可見的,這即是Java內存模型中共享變量的內存不可見問題。

在JVM中我們可以把變量使用volatile關鍵字修飾或者使用JUC包中的原子性變量比如AtomicLong對普通變量進行包裝來保證多線程下共享變量的內存可見性,當然使用加鎖的方式也可以保證內存可見性,但是其開銷更大。既然使用volatile關鍵字可以解決共享變量內存可見性問題,那么為何不把所有變量都使用volatile修飾那?這是因為使用volatile修飾變量,寫入該變量的時候會把cache直接刷新會內存,讀取時候會把cache內緩存失效,然后從主內存加載數據,這就破壞了cache的命中率,對性能是有損的。

所以我們需要細心的分析哪些變量需要使用volatile修飾,但是即使開發人員意識到volatile可以解決內存不可見問題,但是從系統中找出哪些變量需要使用volatile或者原子性結構進行修飾也是一個困難的事情,這使得我們在非業務邏輯處理上需要耗掉一部分精力。

小結:

  • 在現在多核CPU的硬件架構中,多線程之間不再有真正的共享內存,cpu核心之間顯示傳遞數據塊(cache 行)將和網絡中不同計算機之間傳遞數據一樣。 CPU核心之間通信和網絡通信的共同點比許多人意識到的要多。現在跨CPU或聯網計算機傳遞消息已成為一種規范。
  • 除了通過使用volatile修飾共享的變量或使用原子數據結構保證共享變量內存可見性之外,一個更嚴格和原則上的方法是將狀態保持在并發實體本地,并通過消息顯式在并發實體之間傳播數據或事件。

對調用堆棧的誤解

提起調用堆棧( Call stacks)大家都耳熟能詳,但是其被發明是在并發編程不是那么重要時候,那時候多核cpu系統還不常見,所以調用堆棧不會跨線程,因此不會為異步調用鏈提供調用堆棧能力。

在多線程下,當主線程(調用線程)開啟一個異步線程運行異步任務時候,問題就出現了。這時候主線程會將共享對象放到異步線程可以訪問到的共享內存里面,然后開啟異步線程后主線程繼續做自己的事情,而異步線程則會從共享內存中訪問到主線程創建的共享對象,然后進行異步處理。

進行異步處理時候遇到的第一個問題是當異步線程執行完畢任務后,如何通知主線程?另外當異步任務執行出現異常時候該怎么做?這個異常將會被異步線程捕獲,并且不會傳遞給主調用線程。

理論上主調用線程需要在異步任務執行完畢或者出異常時候被通知,但是沒有調用堆棧可以傳遞異常。異步任務執行失敗的的通知只能通過輔助方式完成,比如Future方式,將錯誤碼寫到主調用線程所在的地方,否則一旦準備好就希望得到結果。如果沒有此通知,則主調用線程將永遠不會收到失敗通知,并且任務將丟失!這類似于網絡系統的工作方式,其中消息/請求可能會丟失/失敗而不會發出任何通知。

當真的發生錯誤時,這種情況會變得更糟,當異步工作線程遇到錯誤時候會導致最終陷入無法恢復的境地。例如由錯誤引起的內部異常會冒泡到線程的根,并使線程關閉。這立即引發了一個問題,誰應該重新啟動該異步線程執行的任務,以及如何將其還原到已知狀態?乍一看,這似乎是可以管理的,但我們突然遇到了一個新的現象:異步線程當前正在執行的實際任務我們并沒有存放起來。實際上,由于到達頂部的異常使所有調用棧退出,任務狀態已經完全丟失了!即使這是本地通信,也沒有網絡連接,但是我們還是丟失了一條消息(可能會丟失消息)。

小結:

為了在當前系統上實現任何有意義的并發性和提高性能,線程必須以高效的方式在彼此之間委派任務,而不會阻塞。使用這種類型的任務委派并發(甚至在網絡/分布式計算中更是如此),基于調用堆棧的錯誤處理會導致崩潰。因此需要引入新的顯式錯誤信令機制,讓失敗成為域模型的一部分。

具有工作委派的并發系統需要處理服務故障,并需要具有從故障中恢復的原則方法。此類服務的客戶端需要注意,任務/消息可能會在重新啟動期間丟失。即使沒有發生損失,由于先前排隊的任務(較長的隊列)或者垃圾回收導致的延遲等,將會導致響應可能會被任意延遲。面對這些情況,并發系統應以超時的形式處理響應截止日期。

本文名稱:Java傳統編程模型存在的問題
文章起源:http://www.kartarina.com/news14/103314.html

成都網站建設公司_創新互聯,為您提供網站設計公司網站設計企業網站制作域名注冊網站內鏈靜態網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都定制網站建設
欧美日韩激情_美女国产一区_国产精品久久久久影院日本_69xxx在线
欧美一区二区视频网站| 一区二区在线观看视频在线观看| 欧美在线观看视频一区二区三区| 欧美激情一区二区在线| 国产激情一区二区三区四区| 国产午夜亚洲精品不卡| 国产乱码精品一区二区三区五月婷| 亚洲精品在线观| av不卡一区二区三区| 一区二区三区视频在线观看| 91精品中文字幕一区二区三区| 久久99精品国产91久久来源| 国产精品视频第一区| 9l国产精品久久久久麻豆| 亚洲精品高清在线| 日韩三级在线观看| 91丝袜呻吟高潮美腿白嫩在线观看| 亚洲一区二区三区视频在线播放| 在线成人av网站| 国产超碰在线一区| 亚洲成人综合视频| 久久综合久久久久88| 91亚洲精品久久久蜜桃| 美洲天堂一区二卡三卡四卡视频| 国产色综合久久| 91精品午夜视频| 99久久99久久久精品齐齐| 青青草97国产精品免费观看| 国产精品看片你懂得| 日韩视频一区二区三区在线播放| 99精品偷自拍| 国产一区二区三区观看| 一个色综合av| 国产精品网站一区| 日韩三级伦理片妻子的秘密按摩| 91视频精品在这里| 国产在线观看一区二区| 日韩中文字幕一区二区三区| 日韩毛片精品高清免费| 久久在线观看免费| 日韩免费视频一区| 欧美日本一区二区三区| 国产亚洲精久久久久久| 欧美一级午夜免费电影| 欧美自拍偷拍一区| 色网综合在线观看| 成人av网在线| 国产成人精品一区二区三区四区| 麻豆专区一区二区三区四区五区| 夜夜揉揉日日人人青青一国产精品| 国产午夜精品一区二区三区四区| 欧美xxxxx裸体时装秀| 欧美三级日本三级少妇99| 成人免费观看av| 国产精品一区二区在线看| 另类小说综合欧美亚洲| 日本不卡一二三区黄网| 日韩精品高清不卡| 麻豆极品一区二区三区| 国内精品第一页| 国产精品一区二区男女羞羞无遮挡 | 一区二区三区中文字幕| 欧美国产一区视频在线观看| 日韩欧美一区二区免费| 91精品欧美一区二区三区综合在| 欧美精品自拍偷拍| 欧美丰满嫩嫩电影| 91精品久久久久久久久99蜜臂| 欧美美女直播网站| 日韩精品在线一区| 国产天堂亚洲国产碰碰| 亚洲同性同志一二三专区| 亚洲在线一区二区三区| 亚洲精品成人在线| 日韩电影一区二区三区四区| 韩国在线一区二区| 成人性生交大片免费看在线播放| 99国产一区二区三精品乱码| 在线一区二区三区四区五区 | 欧美日韩一级视频| 欧美成人精品福利| 国产精品的网站| 午夜精品久久一牛影视| 激情六月婷婷久久| 91看片淫黄大片一级在线观看| 欧美日韩国产另类不卡| 精品国产91乱码一区二区三区| 中文字幕一区二区三区不卡| 日韩主播视频在线| 成人av资源网站| 欧美日韩国产一二三| 国产日韩欧美精品综合| 夜夜嗨av一区二区三区中文字幕| 全国精品久久少妇| aaa亚洲精品| 日韩午夜三级在线| 亚洲裸体xxx| 国产一区 二区 三区一级| 色婷婷av一区二区三区大白胸| 91精品国产手机| 成人免费在线播放视频| 麻豆91精品视频| 色久综合一二码| 国产无一区二区| 日本在线不卡视频一二三区| 91丨porny丨蝌蚪视频| 久久人人超碰精品| 日日噜噜夜夜狠狠视频欧美人| 91一区二区在线| 国产欧美精品一区| 美女被吸乳得到大胸91| 欧美日韩国产精选| 亚洲尤物在线视频观看| 99麻豆久久久国产精品免费| 2欧美一区二区三区在线观看视频| 亚洲综合激情小说| 91亚洲精品乱码久久久久久蜜桃| 久久久精品蜜桃| 国产一区二三区| 日韩精品中文字幕一区二区三区| 亚洲国产欧美在线人成| 在线观看不卡一区| 一区二区三区资源| 91美女片黄在线观看91美女| 中文字幕不卡在线观看| 国产一区二区免费在线| 欧美videossexotv100| 日韩高清不卡一区二区三区| 欧美日韩三级一区二区| 一区二区三区自拍| 欧美在线免费播放| 亚洲影视在线观看| 欧美日韩免费一区二区三区视频| 亚洲午夜久久久久久久久久久| 精品视频资源站| 美国十次了思思久久精品导航| 欧美一区二区视频在线观看2022 | 日韩黄色免费网站| 91精品国模一区二区三区| 男男视频亚洲欧美| 久久尤物电影视频在线观看| 国产一区二区三区高清播放| 国产精品私房写真福利视频| 9i在线看片成人免费| 亚洲激情第一区| 欧美日韩成人综合在线一区二区| 日韩电影免费在线观看网站| 日韩精品影音先锋| 高清在线不卡av| 亚洲精品菠萝久久久久久久| 欧美日韩美少妇| 国产真实乱对白精彩久久| 中文字幕不卡三区| 欧美午夜精品免费| 国产一区欧美一区| 国产精品热久久久久夜色精品三区| 色综合色综合色综合色综合色综合 | 日韩电影免费在线看| www激情久久| 91论坛在线播放| 乱一区二区av| 亚洲欧美激情插| 精品国精品国产| 91小视频在线观看| 久久se精品一区二区| 亚洲欧美在线aaa| 欧美一区二区三区四区久久| 国产盗摄视频一区二区三区| 亚洲一区二区中文在线| 精品av久久707| 在线免费亚洲电影| 国产成人啪免费观看软件 | 国产很黄免费观看久久| 亚洲高清一区二区三区| 国产亚洲精品超碰| 日韩一区二区三区在线视频| 99久久免费精品高清特色大片| 免费精品视频在线| 一区二区三区免费观看| 亚洲国产精品国自产拍av| 91精品国产综合久久精品麻豆| 国产激情精品久久久第一区二区 | 亚洲成人av在线电影| 国产女同互慰高潮91漫画| 欧美日韩一区二区在线观看| 成人av免费网站| 国内不卡的二区三区中文字幕| 亚洲五码中文字幕| 国产精品久久久久久久久动漫| 精品美女一区二区| 这里只有精品免费| 欧美日韩精品系列| 在线观看视频91| 91丨九色丨蝌蚪富婆spa| 国产不卡视频在线播放| 麻豆成人久久精品二区三区红| 亚洲国产成人av网| 亚洲精品免费在线播放| 国产精品视频你懂的| 国产欧美日韩不卡免费|