91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java 高并發 繼續學習 part1_A

發布時間:2020-08-10 11:52:03 來源:網絡 閱讀:174 作者:loserone 欄目:編程語言

本系列博客筆記源于煉數成金教程而寫的筆記

開始前必須清楚知道以下幾點:
一、關于高并發的幾個重要概念
1.1 線程是什么:是操作系統能夠進行運算調度的最小單位,在Java中線程是提供給開發者的實現并發機制的一種有效手段,而多個線程可以產生于一個進程。即線程是進程的一個單位
1.2 進程是什么:進程是系統在執行某個程序關于數據集合上的一次活動,是計算機在進行資源分配和調度的基本單位,是操作系統的基本執行實體。
1.3 同步、異步概念:同步、異步即是方法調用時線程或者是進程在執行時的方式,那么有什么不同之處?同步:調用方法時等待方法的返回。異步:調用方法會即刻返回,但是這里返回并不是指方法執行任務已經完成,異步的機制就是調用的同時在后臺另起線程繼續執行任務。
Java 高并發  繼續學習 part1_A

1.4 并行與并發:
并發與并行在外在表象來看是一樣的。但是實際執行的步驟并非一樣,并行是指兩個任務同時進行,而并發是指兩個任務,一會兒執行A任務,一會兒執行B任務。ps: 所以這里如果是單核(也就是單個CPU)是不能做并行任務的,只能做并發任務。
Java 高并發  繼續學習 part1_A

1.5 臨界區:臨界區用來表示一種公共的資源(或者說是公共的數據),可以被多個線程使用,但是每一次只能有一個線程使用它,一旦這個臨界區被占用,其他線程將無法使用這個資源,要想使用就必須等待。
Java 高并發  繼續學習 part1_A

1.6 阻塞與非阻塞
阻塞和非阻塞通常形容多線程之間的相互影響。比如一個線程占用了臨界區資源,那么其他線程要想得到這個資源就必須在這個臨界區中進行等待,等待會導致線程掛起,這種情況就是阻塞。同時如果占用這個資源的線程一直不愿意釋放這個資源,那么其他阻塞在這個臨界區上的線程將都不能工作。
非阻塞是允許多個線程同時進入這個臨界區,但是這樣一來并不能保證共享數據的安全。
1.7 死鎖、饑餓、活鎖
死鎖:通常是指兩個或者兩個以上的進程在執行過程中,由于競爭資源或者由于彼此通訊而造成的一種阻塞現象,若此間無外力干涉,它們將都無法繼續執行下去,此時稱系統處于死鎖狀態或系統產生死鎖。

雖然死鎖是不好的現象,但是它是一個靜態的問題,一旦發生死鎖,進程被卡,cpu的占有率也是0,它并不會占用住CPU,它會被調用出去。相對于活鎖來說比較好發現和分析。
活鎖:是指事務A可以使用資源,但是它在檢測到其他事務也將執行時會讓其他事務先使用此資源,事務B可以使用此資源,但是它也檢測到其他事務將執行所以也讓其他事務先使用此資源,于是兩者都處于謙讓狀態,都無法使用此資源。
(舉個例子,就如同你在街上遇到個人,剛好他朝著你的反方向走,與你正面碰到,你們都想讓彼此過去。你往左邊移,他也往左邊移,兩人還是無法過去。這時你往右邊移,他也往右邊移,如此循環下去。

一個線程在取得了一個資源時,發現其他線程也想到這個資源,因為沒有得到所有的資源,為了避免死鎖把自己持有的資源都放棄掉。如果另外一個線程也做了同樣的事情,他們需要相同的資源,比如A持有a資源,B持有b資源,放棄了資源以后,A又獲得了b資源,B又獲得了a資源,如此反復,則發生了活鎖。

活鎖會比死鎖更難發現,因為活鎖是一個動態的過程。)ps:原文抄自煉數成金!!!

饑餓:是指某一個或者多個線程因為種種原因無法獲取得到所需要的資源,導致一直無法執行。

1.8 并發級別:阻塞、非阻塞(分為無障礙、無鎖、無等待)

1.8.1 阻塞:上文講到當一個線程進入臨界區后,其他線程必須等待,此狀態稱為阻塞

1.8.2 無障礙
無障礙時一種最弱的非阻塞調度
自由出入臨界區
無競爭時,有限步內完成操作
有競爭時,回滾數據
和非阻塞調度相比呢,阻塞調度是一種悲觀的策略,它會認為說一起修改數據是很有可能把數據改壞的。而非阻塞調度呢,是一種樂觀的策略,它認為大家修改數據未必把數據改壞。但是它是一種寬進嚴出的策略,當它發現一個進程在臨界區內發生了數據競爭,產生了沖突,那么無障礙的調度方式則會回滾這條數據。(上文提到即共享數據不安全)

在這個無障礙的調度方式當中,所有的線程都相當于在拿去一個系統當前的一個快照。他們一直會嘗試拿去的快照是有效的為止。
1.8.3 無鎖
是無障礙的
保證有一個線程可以勝出
與無障礙相比,無障礙并不保證有競爭時一定能完成操作,因為如果它發現每次操作都會產生沖突,那它則會不停地嘗試。如果臨界區內的線程互相干擾,則會導致所有的線程會卡死在臨界區,那么系統性能則會有很大的影響。
同時無鎖增加了一個新的條件,保證每次競爭有一個線程可以勝出,則解決了無障礙的問題。至少保證了所有線程都順利執行下去。
無鎖在Java中很常見
while (!atomicVar.compareAndSet(localVar, localVar+1))
{
localVar = atomicVar.get();
}
1.8.4 無等待
無鎖的
要求所有的線程都必須在有限步內完成
無饑餓的
首先無等待的前提是無鎖的基礎上的,無鎖它只保證了臨界區肯定有進也有出,但是如果進的優先級都很高,那么臨界區內的某些優先級低的線程可能發生饑餓,一直出不了臨界區。那么無等待解決了這個問題,它保證所有的線程都必須在有限步內完成,自然是無饑餓的。
無等待是并行的最高級別,它能使這個系統達到最優狀態。
無等待的典型案例:

如果只有讀線程,沒有線線程,那么這個則必然是無等待的。

如果既有讀線程又有寫線程,而每個寫線程之前,都把數據拷貝一份副本,然后修改這個副本,而不是修改原始數據,因為修改副本,則沒有沖突,那么這個修改的過程也是無等待的。最后需要做同步的只是將寫完的數據覆蓋原始數據。

由于無等待要求比較高,實現起來比較困難,所以無鎖使用得會更加廣泛一些。PS:抄自練數成金

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嘉兴市| 平度市| 陇南市| 嘉祥县| 兴文县| 威宁| 罗甸县| 永善县| 华蓥市| 望奎县| 镇江市| 陵水| 日照市| 通榆县| 蕲春县| 时尚| 绵阳市| 开阳县| 永康市| 渝北区| 恭城| 依兰县| 雷山县| 堆龙德庆县| 曲水县| 绥化市| 武夷山市| 永昌县| 贡山| 中牟县| 密云县| 万年县| 汽车| 桦南县| 连山| 中江县| 民勤县| 湖南省| 九寨沟县| 文山县| 隆化县|