摘要:前言并發(fā)編程的目的是讓程序跑的更快,但并不是啟動(dòng)更多的線程,這個(gè)程序就跑的更快。盡可能降低上下文切換的次數(shù),有助于提高并發(fā)效率。死鎖并發(fā)編程中的另一挑戰(zhàn)是死鎖,會(huì)造成系統(tǒng)功能不可用。
前言
并發(fā)編程的目的是讓程序跑的更快,但并不是啟動(dòng)更多的線程,這個(gè)程序就跑的更快。有以下幾種挑戰(zhàn)。
挑戰(zhàn)及方案 上下文切換單核CPU上執(zhí)行多線程任務(wù),通過(guò)給每個(gè)線程分配CPU時(shí)間片的方式來(lái)實(shí)現(xiàn)這個(gè)機(jī)制。時(shí)間片是CPU分配給每個(gè)線程運(yùn)行的時(shí)間,時(shí)間片非常短,CPU通過(guò)不斷的切換線程執(zhí)行,給我們?nèi)祟?lèi)留下的印象就是多個(gè)線程在同時(shí)執(zhí)行。
由于線程有創(chuàng)建和上下文切換的開(kāi)銷(xiāo),當(dāng)整個(gè)程序內(nèi)部操作數(shù)不高的情況下,并發(fā)執(zhí)行可能比串行執(zhí)行來(lái)的慢。
盡可能降低上下文切換的次數(shù),有助于提高并發(fā)效率。
無(wú)鎖并發(fā)編程。書(shū)中提到多線程競(jìng)爭(zhēng)鎖時(shí)會(huì)發(fā)生上下文切換,所以竟可能避免使用鎖==書(shū)中指的應(yīng)該是為了競(jìng)爭(zhēng)鎖而觸發(fā)的搶占式上下文切換,因?yàn)槿粘6嗑€程運(yùn)行也需要上下文切換==,可以通過(guò)不同線程處理不同分段的數(shù)據(jù)來(lái)降低。
CAS算法。Java中的Atomic包使用CAS算法來(lái)更新數(shù)據(jù),不需要加鎖==CAS算法目前還不是很了解==
使用最少線程。
協(xié)程。協(xié)程,又稱(chēng)微線程,纖程。英文名Coroutine。指的是在單線程里面實(shí)現(xiàn)多任務(wù)的調(diào)度==之前在Python和Go里面聽(tīng)過(guò)這個(gè)概念,不過(guò)還沒(méi)做具體了解。==
死鎖并發(fā)編程中的另一挑戰(zhàn)是死鎖,會(huì)造成系統(tǒng)功能不可用。死鎖是指兩個(gè)或兩個(gè)以上的進(jìn)程或者線程在執(zhí)行過(guò)程中,由于競(jìng)爭(zhēng)資源或者由于彼此通信而造成的一種阻塞的現(xiàn)象。
避免死鎖的常見(jiàn)方法:
避免一個(gè)線程同時(shí)獲取多個(gè)鎖。
盡可能保證一個(gè)鎖內(nèi)只占有一個(gè)資源。
嘗試使用定時(shí)鎖。
資源限制的挑戰(zhàn)比如說(shuō)帶寬只有2Mb/s,你下載速度是1Mb/s,開(kāi)10個(gè)線程速度也不會(huì)變成10Mb/s。書(shū)中提到在并發(fā)編程時(shí)需要考慮到資源上的限制。如果受制于資源,比如我數(shù)據(jù)庫(kù)連接數(shù)就10個(gè),你每次用完都新建線程來(lái)做連接,整體程序的速度肯定會(huì)慢下來(lái)。
解決的方法有以下幾點(diǎn):
對(duì)于硬件資源的限制,可以使用集群來(lái)跑。
對(duì)于軟件資源上的限制,可以復(fù)用資源,比如復(fù)用數(shù)據(jù)庫(kù)連接。
根據(jù)資源的限制,靈活的去調(diào)整并發(fā)度。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70295.html
摘要:目前看的部分主要是這個(gè)關(guān)鍵字。語(yǔ)言提供了,保證了所有線程能看到共享變量最新的值。前綴的指令在多核處理器下會(huì)做兩件事情將當(dāng)前處理器緩存行的數(shù)據(jù)寫(xiě)回到系統(tǒng)內(nèi)存。 這一章節(jié)的話,主要是講一下在并發(fā)操作中常見(jiàn)的volatile、synchronized以及原子操作的相關(guān)知識(shí)。 目前看的部分主要是volatile這個(gè)關(guān)鍵字。 volatile 根據(jù)Java語(yǔ)言規(guī)范第3版中對(duì)volatile的定義...
摘要:前言今天的筆記來(lái)了解一下原子操作以及中如何實(shí)現(xiàn)原子操作。概念原子本意是不能被進(jìn)一步分割的最小粒子,而原子操作意為不可被中斷的一個(gè)或一系列操作。處理器實(shí)現(xiàn)原子操作處理器會(huì)保證基本內(nèi)存操作的原子性。 showImg(https://segmentfault.com/img/bVVIRA?w=1242&h=536); 前言 今天的筆記來(lái)了解一下原子操作以及Java中如何實(shí)現(xiàn)原子操作。 概念 ...
摘要:在之前的文章中學(xué)習(xí)了關(guān)鍵字,可以保證變量在線程間的可見(jiàn)性,但他不能真正的保證線程安全。線程執(zhí)行到指令時(shí),將會(huì)嘗試獲取對(duì)象所對(duì)應(yīng)的的所有權(quán),即嘗試獲得對(duì)象的鎖。從可見(jiàn)性上來(lái)說(shuō),線程通過(guò)持有鎖的方式獲取變量的最新值。 在之前的文章中學(xué)習(xí)了volatile關(guān)鍵字,volatile可以保證變量在線程間的可見(jiàn)性,但他不能真正的保證線程安全。 /** * @author cenkailun *...
摘要:開(kāi)頭正式開(kāi)啟我入職的里程,現(xiàn)在已是工作了一個(gè)星期了,這個(gè)星期算是我入職的過(guò)渡期,算是知道了學(xué)校生活和工作的差距了,總之,盡快習(xí)慣這種生活吧。當(dāng)時(shí)是看的廖雪峰的博客自己也用做爬蟲(chóng)寫(xiě)過(guò)幾篇博客,不過(guò)有些是在前人的基礎(chǔ)上寫(xiě)的。 showImg(https://segmentfault.com/img/remote/1460000010867984); 開(kāi)頭 2017.08.21 正式開(kāi)啟我...
showImg(https://segmentfault.com/img/bVbeIZ4?w=1949&h=1315);
閱讀 2744·2021-11-19 09:40
閱讀 5294·2021-09-27 14:10
閱讀 2099·2021-09-04 16:45
閱讀 1461·2021-07-25 21:37
閱讀 2994·2019-08-30 10:57
閱讀 2980·2019-08-28 17:59
閱讀 1054·2019-08-26 13:46
閱讀 1407·2019-08-26 13:27