亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                每日一練進(jìn)擊大廠「DAY7」并發(fā)編程4

                每日一練進(jìn)擊大廠「DAY7」并發(fā)編程4

                文章目錄

                • 一、有三個(gè)線程T1,T2,T3如何保證順序執(zhí)行
                • 二、AQS
                • 三、CountDownLatch
                • 四、CyclicBarrier
                • 五、Semaphore
                • 六、自旋鎖
                • 七、偏向鎖
                • 八、輕量級(jí)鎖
                • 九、重量級(jí)鎖
                • 十、Synchronized升級(jí)流程
                • 十一、可重入鎖(ReentrantLock)
                • 十二、synchronized和Lock區(qū)別
                • 十三、樂(lè)觀鎖
                • 十四、悲觀鎖
                • 總結(jié)

                一、有三個(gè)線程T1,T2,T3如何保證順序執(zhí)行

                可以使用線程類中的join方法,在一個(gè)線程中啟動(dòng)另一個(gè)線程,另外一個(gè)線程執(zhí)行完該線程繼續(xù)執(zhí)行。T3的run方法中執(zhí)行t2.join(),T2的run方法中執(zhí)行t1.join(),這樣就會(huì)按照T1,T2,T3的順序執(zhí)行了。

                二、AQS

                AQS是java.util.concurrent包下的工具類,全稱是AbstractQueuedSynchronizer抽象隊(duì)列同步器,AQS是多線程同步器,Lock、CountDownLatch、Semaphore都用到了AQS,從本質(zhì)上來(lái)說(shuō)AQS提供了兩種鎖機(jī)制,分別是排它鎖和共享鎖。排它鎖:就是存在多線程競(jìng)爭(zhēng)同一共享資源時(shí),同一時(shí)刻只允許一個(gè)線程訪問(wèn)該共享資源,也就是多個(gè)線程中只能有一個(gè)線程獲得鎖資源,比如Lock中的ReentrantLock重入鎖實(shí)現(xiàn)就是用到了AQS中的排它鎖功能。共享鎖:也稱為讀鎖,就是在同一時(shí)刻允許多個(gè)線程同時(shí)獲得鎖資源,比如CountDownLatch、Semaphore都是用到了AQS中共享鎖功能。

                三、CountDownLatch

                CountDownLatch是基于執(zhí)行時(shí)間的同步類,允許一個(gè)或多個(gè)線程等待其他線程完成操作,構(gòu)造方法接收一個(gè)int參數(shù)作為計(jì)數(shù)器,如果要等待n個(gè)點(diǎn)就傳入n,每次調(diào)用countDown方法時(shí)計(jì)數(shù)器減1,await方法阻塞當(dāng)前線程直到計(jì)數(shù)器變?yōu)?,由于countDown方法可用在任何地方,所以n個(gè)點(diǎn)既可以是n個(gè)線程,也可以是一個(gè)線程里的n個(gè)執(zhí)行步驟。

                public class CountDownLatchDemo { //主線程等待子線程執(zhí)行完畢 public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(5); for (int i = 0; i { try { Thread.sleep(5000); } catch (Exception e) { } System.out.println(Thread.currentThread().getName() + “執(zhí)行了此任務(wù)”); countDownLatch.countDown(); }).start(); } countDownLatch.await(); System.out.println(“執(zhí)行主線程代碼”); }}public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { //子線程等主線程計(jì)數(shù)器變0一起執(zhí)行 CountDownLatch countDownLatch = new CountDownLatch(1); for (int i = 0; i { try { countDownLatch.await(); } catch (Exception e) { } System.out.println(Thread.currentThread().getName() + “執(zhí)行了此任務(wù)”); }).start(); } Thread.sleep(5000); System.out.println(“執(zhí)行主線程代碼”); countDownLatch.countDown(); }}

                四、CyclicBarrier

                循環(huán)屏障是基于同步到達(dá)某個(gè)點(diǎn)的信號(hào)量觸發(fā)機(jī)制,作 是讓 組線程到達(dá) 個(gè)屏障時(shí)被阻塞,直到最后 個(gè)線程到達(dá)屏障才會(huì)解除。構(gòu)造 法中的參數(shù)表示攔截線程數(shù)量,每個(gè)線程調(diào) await 法告訴CyclicBarrier 已到達(dá)屏障,然后被阻塞。還 持在構(gòu)造 法中傳 個(gè) Runnable 任務(wù),當(dāng)線程到達(dá)屏障時(shí)會(huì)優(yōu)先執(zhí) 該任務(wù)。適 于多線程計(jì)算數(shù)據(jù),最后合并計(jì)算結(jié)果的應(yīng) 場(chǎng)景。CountDownLacth 的計(jì)數(shù)器只能 次, CyclicBarrier 的計(jì)數(shù)器可使 reset 法重置,所以CyclicBarrier 能處理更為復(fù)雜的業(yè)務(wù)場(chǎng)景,例如計(jì)算錯(cuò)誤時(shí)可 重置計(jì)數(shù)器重新計(jì)算。

                五、Semaphore

                信號(hào)量 來(lái)控制同時(shí)訪問(wèn)特定資源的線程數(shù)量,通過(guò)協(xié)調(diào)各個(gè)線程以保證合理使 公共資源。信號(hào)量可以 于流量控制,特別是公共資源有限的應(yīng) 場(chǎng)景, 如數(shù)據(jù)庫(kù)連接。Semaphore 的構(gòu)造 法參數(shù)接收 個(gè) int 值,表示可 的許可數(shù)量即最 并發(fā)數(shù)。使 acquire 法獲得 個(gè)許可證,使 release 法歸還許可,還可以 tryAcquire 嘗試獲得許可。

                六、自旋鎖

                synchronized是重量級(jí)鎖,拿到鎖必須要阻塞,當(dāng)量大的時(shí)候會(huì)一直阻塞喚醒,優(yōu)化一下,不要讓其阻塞,只是告訴有這么個(gè)標(biāo)記,在synchronized的邊界做循環(huán),這就是自旋,如果做了多次循環(huán)發(fā)現(xiàn)還沒(méi)有獲得鎖,再阻塞。

                七、偏向鎖

                有一個(gè)線程來(lái)訪問(wèn)代碼塊,沒(méi)有鎖的競(jìng)爭(zhēng),偏向某個(gè)線程,把偏向鎖的偏向標(biāo)記存儲(chǔ)為線程的線程id(主要是同一個(gè)線程反復(fù)搶占鎖的場(chǎng)景),只有一個(gè)線程,如果線程搶占那么就會(huì)升級(jí)成輕量級(jí)鎖,偏向鎖默認(rèn)是關(guān)閉的。

                八、輕量級(jí)鎖

                有線程競(jìng)爭(zhēng),自旋去判斷這個(gè)對(duì)象的鎖是否釋放,自旋次數(shù)(默認(rèn)根據(jù)上一次自旋次數(shù)和鎖的釋放時(shí)間來(lái)決定),會(huì)升級(jí)重量級(jí)鎖

                九、重量級(jí)鎖

                線程阻塞等待。

                十、Synchronized升級(jí)流程

                首先synchronized會(huì)嘗試使用偏向鎖的方式去競(jìng)爭(zhēng)鎖資源,如果能夠競(jìng)爭(zhēng)到偏向鎖,表示加鎖成功直接返回。如果競(jìng)爭(zhēng)鎖失敗,說(shuō)明當(dāng)前鎖已經(jīng)偏向了其他線程,需要將鎖升級(jí)到輕量級(jí)鎖,在輕量級(jí)鎖狀態(tài)下,競(jìng)爭(zhēng)鎖的線程根據(jù)自適應(yīng)自旋次數(shù)去搶占鎖資源。如果在輕量級(jí)鎖狀態(tài)下還是沒(méi)有競(jìng)爭(zhēng)到鎖,就只能升級(jí)到重量級(jí)鎖,在重量級(jí)鎖狀態(tài)下,沒(méi)有競(jìng)爭(zhēng)到鎖的線程就會(huì)被阻塞,線程的狀態(tài)就是Blocked。

                十一、可重入鎖(ReentrantLock)

                在運(yùn)行的某個(gè)函數(shù)或者代碼,因?yàn)閾屨假Y源或者中斷等原因?qū)е潞瘮?shù)或者代碼的運(yùn)行中斷,等待中斷程序執(zhí)行結(jié)束后,重新進(jìn)入這個(gè)函數(shù)或者代碼中運(yùn)行,并且運(yùn)行結(jié)果不會(huì)受到影響,那么這個(gè)函數(shù)或者代碼就是可重入的。ReentrantLock類實(shí)現(xiàn)了Lock,它擁有與synchronized相同的并發(fā)性和內(nèi)存語(yǔ)義。線程A在第一次搶占到鎖,在還沒(méi)有釋放之前再次得到鎖,這個(gè)時(shí)候就不需要重新?lián)屨兼i,而是增加重入次數(shù),然后鎖需要被釋放兩次才能獲得真正的釋放。ReentrantLock是一種可重入的排它鎖,主要用來(lái)解決多線程對(duì)共享資源競(jìng)爭(zhēng)的問(wèn)題特性:1)支持可重入。2)支持公平和非公平。3)提供了阻塞競(jìng)爭(zhēng)鎖和非阻塞競(jìng)爭(zhēng)鎖的兩種方法,分別是lock()和tryLock()。幾個(gè)非常關(guān)鍵的技術(shù):鎖的競(jìng)爭(zhēng),ReentrantLock通過(guò)互斥變量,使用CAS機(jī)制來(lái)實(shí)現(xiàn)的,沒(méi)有競(jìng)爭(zhēng)到鎖的線程,使用了AbstractQueuedSynchronized這樣一個(gè)隊(duì)列同步器來(lái)存儲(chǔ),底層是通過(guò)雙向鏈表來(lái)實(shí)現(xiàn)的,當(dāng)鎖被釋放之后,會(huì)從AQS隊(duì)列里的頭部喚醒下一個(gè)等待鎖的線程。公平和非公平的特性,主要體現(xiàn)在競(jìng)爭(zhēng)鎖的時(shí)候,是否需要判斷AQS隊(duì)列存在等待中的線程。等待隊(duì)列里的鎖則是公平鎖,如果都可以競(jìng)爭(zhēng)鎖,則是非公平鎖。鎖的重入特性,在AQS里面有一個(gè)成員變量來(lái)保存當(dāng)前獲得鎖的線程,當(dāng)同一個(gè)線程下次再來(lái)競(jìng)爭(zhēng)鎖的時(shí)候,就不會(huì)去走鎖競(jìng)爭(zhēng)的邏輯,而是直接增加重入次數(shù)。

                十二、synchronized和Lock區(qū)別

              1. synchronized是關(guān)鍵字,是底層JVM層面實(shí)現(xiàn),Lock是java的juc包下的接口實(shí)現(xiàn)。
              2. synchronized異常會(huì)釋放鎖,lock必須手動(dòng)釋放鎖。
              3. synchronized不能響應(yīng)中斷,lock可以響應(yīng)中斷。
              4. synchronized可重入,非公平,lock可重入、可公平可非公平。
              5. synchronized通過(guò)兩種方式來(lái)控制鎖的粒度一種是修飾在方法層面,另一種是修飾在代碼塊上。Lock鎖的粒度是通過(guò)它里面提供的lock()和unlock()方法決定的。
              6. Lock比synchronized靈活性更高,Lock可以自主抉擇什么時(shí)候加鎖,什么時(shí)候釋放鎖,Lock還提供了非阻塞的競(jìng)爭(zhēng)鎖方法tryLock()方法,這個(gè)方法通過(guò)返回true/fasle來(lái)告訴當(dāng)前線程是否已經(jīng)有其他線程正在使用鎖。
              7. synchronized引入了偏向鎖、輕量級(jí)鎖、重量級(jí)鎖以及鎖升級(jí)的方式來(lái)優(yōu)化加鎖的性能;Lock則用到了自旋鎖的方式來(lái)實(shí)現(xiàn)性能優(yōu)化。
              8. 十三、樂(lè)觀鎖

                對(duì)于并發(fā)間操作產(chǎn)生的線程安全問(wèn)題持樂(lè)觀狀態(tài),樂(lè)觀鎖認(rèn)為競(jìng)爭(zhēng)不總是會(huì)發(fā)生,因此它不需要持有鎖,將比較替換這兩個(gè)動(dòng)作作為一個(gè)原子操作嘗試去修改內(nèi)存中的變量,如果失敗則表示發(fā)生沖突,那么就應(yīng)該有相應(yīng)的重試邏輯。

                十四、悲觀鎖

                對(duì)于并發(fā)間操作產(chǎn)生的線程安全問(wèn)題持悲觀狀態(tài),悲觀鎖認(rèn)為競(jìng)爭(zhēng)總是會(huì)發(fā)生,因此每次對(duì)某資源進(jìn)行操作時(shí),都會(huì)持有一個(gè)獨(dú)占的鎖,就像synchronized,直接上鎖操作資源。


                總結(jié)

                擇一良人,選一城市,三餐四季,春夏秋冬

                鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年7月9日 09:15
                下一篇 2022年7月9日 09:15

                相關(guān)推薦

                • 分享4條發(fā)微商朋友圈的方法(微商朋友圈應(yīng)該怎么發(fā))

                  對(duì)于微商朋友來(lái)說(shuō),朋友圈的重要性不言而喻了。 那么微商的朋友圈到底該怎么發(fā)呢? 為什么同樣是經(jīng)營(yíng)一個(gè)朋友圈,有的微商看起來(lái)逼格滿滿,實(shí)際效果也不錯(cuò);而有的卻動(dòng)都不動(dòng)就被屏蔽甚至拉黑…

                  2022年11月27日
                • 推薦48個(gè)微商引流推廣的方法(微商引流推廣的方法有哪些)

                  微商引流技能01——同行互推 資源共享,大家才會(huì)共贏。加入你是做穴位貼的,你的朋友是做化妝品的,這是兩個(gè)沒(méi)有交集的行業(yè),你們可以友情互推,這樣每個(gè)月的資源就都擴(kuò)大了一倍,而且這些資…

                  2022年11月27日
                • 微軟表示:《GTA6》預(yù)計(jì)將于2024年發(fā)售

                  微軟表示:《GTA6》預(yù)計(jì)將于2024年發(fā)售 近日,微軟在回應(yīng)英國(guó)競(jìng)爭(zhēng)與市場(chǎng)管理局(CMA)調(diào)查其收購(gòu)動(dòng)視暴雪時(shí)提到,《GTA6》預(yù)計(jì)將在2024年發(fā)售。 “備受期待的《GTA6》…

                  2022年11月26日
                • 《寶可夢(mèng)朱紫》夢(mèng)特性怎么獲得?隱藏特性獲取方法推薦

                  寶可夢(mèng)朱紫里有很多寶可夢(mèng)都是擁有夢(mèng)特性會(huì)變強(qiáng)的寶可夢(mèng),很多玩家不知道夢(mèng)特性怎么獲得,下面就給大家?guī)?lái)寶可夢(mèng)朱紫隱藏特性獲取方法推薦,感興趣的小伙伴一起來(lái)看看吧,希望能幫助到大家。 …

                  2022年11月25日
                • 《寶可夢(mèng)朱紫》奇魯莉安怎么進(jìn)化?奇魯莉安進(jìn)化方法分享

                  寶可夢(mèng)朱紫中的奇魯莉安要怎么進(jìn)化呢?很多玩家都不知道,下面就給大家?guī)?lái)寶可夢(mèng)朱紫奇魯莉安進(jìn)化方法分享,感興趣的小伙伴一起來(lái)看看吧,希望能幫助到大家。 奇魯莉安進(jìn)化方法分享 奇魯莉安…

                  2022年11月25日
                • cpu性能天梯圖2022 AMD CPU天梯圖最新排行榜出爐

                  用戶在DIY自己的主機(jī)時(shí)選擇CPU是非常關(guān)鍵的,CPU可以說(shuō)是電腦的大腦,大家也都想追求好一點(diǎn)的CPU來(lái)使用,但型號(hào)太多了,大部分的用戶都不知道目前哪一款CPU比較好用,快來(lái)看看詳…

                  2022年11月24日
                • 《寶可夢(mèng)朱紫》暴飛龍?jiān)趺醋ィ勘╋w龍獲得方法

                  寶可夢(mèng)朱紫暴飛龍位置在哪?在游戲中,很多玩家還不清楚暴飛龍具體要怎么樣獲得,其實(shí)獲得方法很簡(jiǎn)單,暴飛龍直接是沒(méi)得抓的,需要玩家從寶貝龍進(jìn)化得到,下面一起來(lái)看一下寶可夢(mèng)朱紫暴飛龍獲得…

                  2022年11月23日
                • 《寶可夢(mèng)朱紫》布土撥怎么進(jìn)化?布土撥進(jìn)化方法介紹

                  寶可夢(mèng)朱紫中,不同的寶可夢(mèng)有不同的進(jìn)化方法,其中布土撥的進(jìn)化方法是比較特殊的。很多玩家不知道寶可夢(mèng)朱紫布土撥怎么進(jìn)化,下面就帶來(lái)寶可夢(mèng)朱紫布土撥進(jìn)化方法介紹,一起來(lái)看看吧,希望能幫…

                  2022年11月23日
                • 《寶可夢(mèng)朱紫》薄荷怎么獲得?薄荷獲得方法

                  寶可夢(mèng)朱紫中薄荷有改變寶可夢(mèng)的屬性或性格等效果,很多玩家想知道寶可夢(mèng)朱紫薄荷怎么獲得,下面就帶來(lái)寶可夢(mèng)朱紫薄荷獲得方法,感興趣的小伙伴一起來(lái)看看吧,希望能幫助到大家。 薄荷獲得方法…

                  2022年11月23日
                • 《寶可夢(mèng)朱紫》怎么交換精靈?交換精靈方法一覽

                  寶可夢(mèng)朱紫中玩家可以和好友或者npc進(jìn)行交換寶可夢(mèng)獲得自己沒(méi)有的寶可夢(mèng),很多玩家想知道寶可夢(mèng)朱紫怎么交換精靈,下面就帶來(lái)寶可夢(mèng)朱紫交換精靈方法一覽,感興趣的小伙伴不要錯(cuò)過(guò),希望能幫…

                  2022年11月23日

                聯(lián)系我們

                聯(lián)系郵箱:admin#wlmqw.com
                工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息