日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 并发编程-不懂原理多吃亏(送书福利)

發(fā)布時間:2025/3/20 java 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 并发编程-不懂原理多吃亏(送书福利) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


作者 | 加多

關注阿里巴巴云原生公眾號,后臺回復關鍵字“并發(fā)”,即可參與送書抽獎!
**


導讀:并發(fā)編程與 Java 中其他知識點相比較而言學習門檻較高,從而導致很多人望而卻步。但無論是職場面試,還是高并發(fā)/高流量系統(tǒng)的實現(xiàn),都離不開并發(fā)編程,于是能夠真正掌握并發(fā)編程的人成為了市場迫切需求的人才。本文中,作者加多以通俗易懂的方式講解了多線程并發(fā)編程從入門到實踐需要掌握的理論知識與實際操作方法。

學習并發(fā)編程


Java 并發(fā)編程作為 Java 技術(shù)棧中的一根頂梁柱,其學習成本還是比較大的,很多人學習起來感到?jīng)]有頭緒、無從下手。那么學習并發(fā)編程是否有一些技巧在里面呢?

為了讓開發(fā)者從 Java 并發(fā)編程的苦海中解脫出來,大神 Doug Lea 特意為 Java 開發(fā)人員做了一件事情,那就是在 JDK 中提供了 Java 并發(fā)包(JUC)。

該包提供了常用的并發(fā)相關的工具類,比如鎖、并發(fā)安全的隊列、并發(fā)安全的列表、線程池、線程同步器等。有了 JUC 包,開發(fā)人員編寫并發(fā)程序的時候,就不再那么吃力了;但是工具雖好,如果你對其原理不了解,還是很容易犯錯,即:不懂原理多吃虧。

下面為大家舉三個例子進行說明:

  • 最簡單的并發(fā)安全隊列 LinkedBlockingQueue,其 offer 與 put 方法的區(qū)別。什么時候用 offer,什么時候用 put,你可能在某個時間點知道,但是過一段時間可能就會忘記。但如果你對其原理了解,翻看下代碼,就可以知道:offer 是非阻塞的,隊列滿了,就丟棄當前元素;put 是阻塞的,隊列滿則會掛起當前線程進行等待;
  • 使用線程池的時候,意在讓調(diào)用線程把任務放入線程池后直接返回,讓任務異步執(zhí)行。如果你沒注意拒絕策略為 CallerRunsPolicy,并且不知道線程池隊列滿后,拒絕策略的執(zhí)行是當前調(diào)用線程,那么你在拒絕策略里面就會做很耗時的動作,導致當前調(diào)用線程被阻塞很久;
  • 當你使用 Executors.newFixedThreadPool 等創(chuàng)建線程池的時候,如果你不知道其內(nèi)部創(chuàng)建了一個無界隊列,那么當大量任務被投遞到創(chuàng)建的線程池里面后,可能就會造成 OOM(OutOfMemoryError)。另外當你不知道線程池里面的線程是用戶線程還是 deamon 線程的時候,且沒有調(diào)用線程池的 shutdown 方法,則創(chuàng)建線程池的應用也許就不能優(yōu)雅退出。


上面的幾個例子,意在說明雖然有了 JUC 包,但是不懂原理依然會很吃虧。那么我們?yōu)楹尾换ㄐr間來研究下 JUC 包重要組件的實現(xiàn)原理呢?

有人可能會說:我看了但看不懂,每個組件里面涉及的知識太多了。沒錯, JUC 包重要組件的實現(xiàn)的確是由并發(fā)編程基礎知識搭建起來的,所以大家在看組件實現(xiàn)原理前,應該先去把并發(fā)的相關基礎知識學好,然后由淺入深進行研究。

比如最基礎的線程基礎操作原語 notify/wait 系列,join 方法、sleep 方法、yeild 方法;線程中斷的理解;死鎖的產(chǎn)生與避免;什么時候是用戶線程、什么時候是 deamon 線程?什么是偽共享以及如何解決?Java 內(nèi)存模型是什么?什么是內(nèi)存不可見性以及如何避免?volatile 與 Synchronized 內(nèi)存語義是什么,它是用來解決什么問題的?什么是 CAS 操作,它的出現(xiàn)為了解決什么問題?ABA 問題是什么?什么是指令重排序,如何避免?什么是原子性操作?什么是獨占鎖,共享鎖,公平鎖,非公平鎖?······

如果你已經(jīng)掌握了上面列出的所有基礎知識,那么就可以先看 JUC 包中最簡單的基于 CAS 無鎖實現(xiàn)的原子性操作類如:AtomicLong 的實現(xiàn)??赡苣銜兴蓡?#xff1a;其中的變量 value 為何使用 volatile 修飾(多線程下保證內(nèi)存可見性)?

接下來大家可以看到 JDK8 新增原子操作類 LongAdder,在非常高的并發(fā)請求下,AtomicLong 的性能會受影響,這是因為雖然 AtomicLong 使用無數(shù) CAS 算法,但是 CAS 失敗后還是通過無限循環(huán)的自旋鎖不斷嘗試的。在高并發(fā)下 N 多線程同時去操作一個變量,會造成大量線程 CAS 失敗,然后處于自旋狀態(tài),這大大浪費了 cpu 資源。

既然 AtomicLong 性能是由于過多線程同時去競爭一個變量的更新而降低的,那么如果把一個變量分解為多個變量,讓同樣多的線程去競爭多個資源,性能問題不就解決了?JDK8 提供的 LongAdder 就是這個思路。看到這里大家或許會眼前一亮。

最后大家可以去看一下,比較簡單的并發(fā)安全基于寫時拷貝的 CopyOnWriteArrayList 的實現(xiàn),以及探究其迭代器的弱一致性實現(xiàn)原理(即寫時拷貝)。

接下來進入核心環(huán)節(jié),也就是對 JUC 包中鎖的研究。

一開始要先把 LockSupport 類研究透,即:鎖中讓線程掛起與喚醒的基礎設施。由于鎖是基于 AQS(AbstractQueuedSynchronizer)實現(xiàn)的,所以肯定要先把 AQS 搞清楚。

你將會發(fā)現(xiàn) AQS ?中維持了一個單一的狀態(tài)信息 state, 可以通過 getState,setState,compareAndSetState 函數(shù)修改其值。

對于 ReentrantLock 的實現(xiàn)來說,state 可以用來表示當前線程獲取鎖的可重入次數(shù);對于讀寫鎖 ReentrantReadWriteLock 來說,state 的高 16 位表示讀狀態(tài),也就是獲取該讀鎖的次數(shù),低 16 位表示獲取到寫鎖線程的可重入次數(shù);對于 semaphore 來說,state 用來表示當前可用信號的個數(shù);對于 FutuerTask 來說,state 用來表示任務狀態(tài)(例如還沒開始,運行,完成,取消);對于 CountDownlatch 和 CyclicBarrie 來說,state 用來表示計數(shù)器當前的值。

AQS 有個內(nèi)部類 ConditionObject 是用來結(jié)合鎖實現(xiàn)線程同步,ConditionObject 可以直接訪問 AQS 對象內(nèi)部的變量,比如 state 狀態(tài)值和 AQS 隊列。ConditionObject 是條件變量,每個條件變量對應著一個條件隊列 (單向鏈表隊列),用來存放調(diào)用條件變量的 await() 方法后被阻塞的線程。

AQS 類并沒有提供可用的 tryAcquire 和 tryRelease,正如 AQS 是鎖阻塞和同步器的基礎框架,tryAcquire 和 tryRelease 需要有具體的子類來實現(xiàn)。子類在實現(xiàn) tryAcquire 和 tryRelease 的時候,要根據(jù)具體場景使用 CAS 算法嘗試修改狀態(tài)值 state, 成功則返回 true, 否則返回 false。子類還需要定義在調(diào)用 acquire 和 release 方法的時候 ,state 狀態(tài)值的增減代表什么含義。

比如繼承自 AQS 實現(xiàn)的獨占鎖 ReentrantLock,定義當 status 為 0 的時候表示鎖空閑;為 1 的時候表示鎖已經(jīng)被占用。在重寫 tryAcquire 的時候,內(nèi)部需要使用 CAS 算法,查看當前 status 是否為 0,如果為 0 則使用 CAS 設置為 1,并設置當前線程的持有者為當前線程,返回 true;如果 CAS 失敗則返回 false。

ReentrantLock?在實現(xiàn) tryRelease 的時候,內(nèi)部需要使用 CAS 算法把當前 status 的值從 1 修改為 0,并設置當前鎖的持有者為 null,然后返回 true, 如果 cas 失敗則返回 false。

知道 AQS 是什么后,下面先看最簡單的獨占鎖 ReentrantLock。你可以先畫出其類圖結(jié)構(gòu),看看有哪些變量和方法,將會發(fā)現(xiàn)它有著公平鎖與獨占鎖之分(回顧基礎篇)。

類圖中狀態(tài)值 state 代表線程獲取該鎖的可重入次數(shù),當一個線程第一次獲取該鎖時, state 的值為 0;第二次獲取后,該鎖狀態(tài)值為 1,這就是可重入次數(shù)。然后加大難度,看看讀寫鎖 ReentrantReadWriteLock 是怎么實現(xiàn)讀寫分離、增加并發(fā)度的,別忘了還有 JDK 新增的 StampedLock 。

等鎖研究完了,就可以對并發(fā)隊列進行研究了。其中,隊列要分為基于 CAS 的無阻塞隊列 ConcurrentLinkedQueue ?和其他基于鎖的阻塞隊列。先看比較簡單的 ArrayBlockingQueue,LinkedBlockingQueue,ConcurrentLinkedQueue,別忘了還有高級的優(yōu)先級隊列 PriorityBlockingQueue 和延遲隊列 DelayQueue。

好像少了線程池?線程池主要解決兩個問題:

  • 當執(zhí)行大量異步任務的時候,線程池能夠提供較好的性能;在不使用線程池且需要執(zhí)行異步任務時,直接 new 一線程進行運行,線程的創(chuàng)建和銷毀是需要開銷的。線程池里面的線程是可復用的,不會每次執(zhí)行異步任務時候都重新創(chuàng)建和銷毀線程;
  • 線程池提供了一種資源限制和管理的手段。比如可以限制線程的個數(shù)、動態(tài)新增線程等,每個 ThreadPoolExecutor 也保留了一些基本的統(tǒng)計數(shù)據(jù),如:當前線程池完成的任務數(shù)目等。


前面講解過 Java 中線程池 ThreadPoolExecutor 原理的探究,ThreadPoolExecutor 是 Executors 工具類里的一部分功能。下面介紹另外一部分功能,也就是 ScheduledThreadPoolExecutor 的實現(xiàn),它是一個可以指定一定延遲時間后或者定時進行任務調(diào)度執(zhí)行的線程池。

JUC 中重要的高級線程同步器 CountDownLatch、CyclicBarrier、Semaphore 也不能忽略,這些高級的同步器會大大簡化我們編寫線程同步任務的門檻、降低我們的出錯率。

雖然 Java 并發(fā)編程內(nèi)容很廣,但還是有一些規(guī)則可以遵循,比如線程。線程池創(chuàng)建的時候要指定名稱以便排查問題,線程池使用完畢記得關閉,ThreadLocal 使用完畢記得調(diào)用 remove 清理,SimpleDateFormat 類是線程不安全的等等。

總結(jié)


如果你對上面的內(nèi)容感興趣,但對學并發(fā)無從下手,那么機會來了!《Java并發(fā)編程之美》這本書,就是按照以上的思路來編寫的,該書在京東上被列為 10 大精選書籍之一。

購買鏈接:https://item.m.jd.com/product/12450812.html


掃描下方二維碼添加小助手,與 8000 位云原生愛好者討論技術(shù)趨勢,實戰(zhàn)進階!

進群暗號:公司-崗位-城市


關注阿里巴巴云原生公眾號,后臺回復關鍵字“并發(fā)”,即可參與送書抽獎!**

總結(jié)

以上是生活随笔為你收集整理的Java 并发编程-不懂原理多吃亏(送书福利)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一级片在线播放 | 91网在线看 | 中文字幕综合 | 美日韩免费| jjzz在线| 中文字幕日韩精品在线 | 伊人春色av | 98国产精品 | av影片在线观看 | 综合网在线观看 | 91看大片| 嫩色av| 视色在线 | 欧美偷拍一区二区三区 | 少妇久久久久久被弄高潮 | 成人毛片基地 | 欧美a天堂| 动漫一区二区三区 | 国产一区二区三区观看 | 最新中文字幕久久 | 欧美亚洲国产成人 | 国产13页 | 男人的天堂视频 | 性xxxx欧美老肥妇牲乱 | 色 综合 欧美 亚洲 国产 | 日本国产视频 | 国产福利精品在线观看 | 久久精品一区二区三区黑人印度 | 亚洲熟妇无码乱子av电影 | 亚洲精品一二三四区 | 女人扒开腿让男人捅爽 | 欧美h在线观看 | 日韩福利一区 | av中文在线 | 精品熟妇视频一区二区三区 | 久久aⅴ乱码一区二区三区 亚洲成人18 | 国产美女精品人人做人人爽 | 国产一级二级毛片 | 日韩福利视频在线观看 | 日日干狠狠干 | 日韩色网 | 日韩 国产 欧美 | 黄色大片久久 | 精品国产伦一区二区三 | 青青草原亚洲 | 伊人久久艹 | 精品视频免费在线观看 | 亚洲精品乱码久久久久久麻豆不卡 | 美女诱惑一区二区 | 亚洲乱仑| 国产黄色片子 | 97狠狠| 日韩午夜精品视频 | 欧美肥妇bwbwbwbxx | 国产精品入口夜色视频大尺度 | 久久久久久婷 | 日本a在线 | 日本作爱视频 | 一区二区精品视频在线观看 | 欧美大片免费观看 | 美女又大又黄 | 男人和女人日b视频 | 国产日韩在线观看一区 | 一区二区日韩国产 | 天堂av中文在线 | 麻豆精品av | 国产专区第一页 | 亚洲色图插插插 | 成人黄色小说视频 | 夜夜嗨av一区二区三区四区 | 国产视频观看 | 成人免费观看视频 | 麻豆疯狂做受xxxx高潮视频 | 天堂综合 | 中文字幕国产亚洲 | 成人免费高清 | 91黄址 | 精品久久久久一区二区 | 国产精品怡红院 | 精东av在线 | 秋霞7777鲁丝伊人久久影院 | 免费成人在线观看 | 成人性生活视频 | 黄页av| 九九热视频在线播放 | 美女视频三区 | av伦理在线 | 国产精品www在线观看 | 亚洲成年人网站在线观看 | 色乱码一区二区三区在线男奴 | 日韩理论片在线观看 | 午夜电影网站 | 黄在线观看免费 | a级无遮挡超级高清-在线观看 | 在线不卡中文字幕 | 一级黄色免费网站 | 不卡的一区二区 | 青青草原av在线 | 日韩毛片在线视频 |