Java並發包下鎖學習第一篇:介紹及學習安排

2020-12-25 凱哥Java

Java並發包下鎖學習第一篇:介紹及學習安排

在Java並發編程中,實現鎖的方式有兩種,分別是:可以使用同步鎖(synchronized關鍵字的鎖),還有lock接口下的鎖。從今天起,凱哥將帶領大家一起豪華參觀(詳細講解)在Java並發包(JUC)下locks包下的體系結構。

在這個系列中,我們將會學習並發包下鎖實現的原理(我們將跟著源碼來分析)、什麼是可重入鎖、公平鎖和非公平鎖怎麼定義的、為什麼synchronized關鍵字的鎖和ReentrantLock默認會選擇非公平鎖?讀寫鎖和獨佔鎖的比較、跟著源碼我們來分析讀寫鎖等和鎖相關的知識。學完這個系列教程後,大家將對並發鎖有更新的理解,歡迎大家一起學習。

本篇是《凱哥(凱哥Java:kagejava)並發編程學習》系列之《Lock系列》教程的第一篇:《Java並發包下鎖學習第一篇》

本文主要內容:java中鎖定義及在jdk5以後的並發包(JUC)下鎖相關的類及類關係圖;怎麼學習JUC下鎖

凱哥講解一般步驟:先舉生活中的例子,然後從例子中總結,然後在用代碼演示。經過這三個步驟來加深大家的印象。

一:鎖的理解

在多線程場景下,多個線程要操作同一個資源,這個被競爭的資源就是共享資源。當同時有多個線程一起競爭共享資源的時候,如果一個線程競爭到了這個資源,就需要使用一個手段或者是技術通知其他線程,這個資源已經被佔用著,其他線程需要等待才可以。基於這種思想,在我們現實生活中,如何讓其他人知道某個東西是你的呢?貼上你的名字、打上標識或者是用一把鎖鎖著。這樣別人就競爭不了了。鎖就是這個通知其他人(或線程)的一種手段。所以,在多線程環境下,就是用了這種技術來實現對共享資源的控制。

二:JUC下locks包下體系

我們先來看看JUC下的locks包都有哪些類或接口。

JUC包下鎖相關的類:

上圖中類之間的關係可以簡單如下圖:

鎖之間類圖關係:

更簡單明了的如下圖:

三:類介紹

AbstractOwnableSynchronizer:隊列同步器。

該類是用來構建鎖或者其他同步組件的基礎框架的頂級抽象類。有兩個子類

AbstractQueuedLongSynchronizer:是AbstractQueuedSynchronizer類的另一個版本類。區別就在原AbstractQueuedLongSynchronizer類裡面狀態碼使用Long類型的而非int類型的。凱哥在以後文章中將詳細介紹AbstractQueuedSynchronizer類的。

AbstractQueuedSynchronizer:隊列同步器。

使用比較多的。是構建鎖或者其他同步組建的基礎框架。其通過一個int成員變量來表示同步狀態的。通過內部類Node來實現FIFO(first-in-first-out:即先進先出)的隊列來完成獲取資源線程排隊的操作。

Lock:

排他鎖的頂級接口。

RenntrantLock:

Lock的實現類。可重入鎖。內部有公平鎖和非公平鎖兩個內部類。

ReadWriteLock:

讀寫鎖的頂級接口

ReentrantReadWriteLock:

讀寫鎖的子類。內部有讀鎖和寫鎖兩個內部類來控制著讀寫分離操作的。

LockSupport:

當要執行阻塞或者是喚醒一個線程的時候,都會使用到lockSupport這個工具類來實現的。

Condition:

監視對象。與lock對象配合使用來實現等待/通知模式

四:學習安排

通過上面介紹我們對並發包下的locks包有所了解了。在接下來的學習中,我們將會按照上面類介紹的順序來學習。先學習同步隊列,跟著源碼來分析主要API;在學習排他鎖;然後再學習讀寫鎖;最後學習後面兩個類。

相關焦點

  • Java並發包下鎖學習第三篇-鎖是怎麼維護內部隊列的
    從源碼學習Java並發的鎖是怎麼維護內部線程隊列的在上一篇文章中,凱哥對同步組件基礎框架- AbstractQueuedSynchronizer(AQS)做了大概的介紹。我們知道AQS能夠通過內置的FIFO隊列來完成資源獲取線程的排隊工作。那麼AQS是怎麼來維護這個排隊工作的呢?今天我們就來扒一扒AQS源碼。從源碼中來看看是怎麼維護對了的。
  • Java並發包下Java多線程並發之讀寫鎖鎖學習第五篇-讀寫鎖
    本篇是《凱哥(凱哥Java:kagejava)並發編程學習》系列之《Lock系列》教程的第七篇:《Java並發包下鎖學習第七篇:讀寫鎖》。一:讀寫鎖的理論什麼是讀寫鎖?通過前面文章的學習,我們知道了ReentrantLock(下文簡稱:RLock)對象了。Rlock比起synchronized(下文簡稱Sync)來說有三個優點:RLock可以被中斷;RLock可以有公平鎖;RLock可以綁定多個條件。那麼既然RLock比Sync有這麼多優點,為什麼還需要讀寫鎖呢?
  • Java並發編程學習前期知識上篇
    Java並發包JUC(java.util.concurrent)有了解過哪些?並發包實現最重要的是什麼?其原理是什麼知道嗎?何為JMM的可見性?volatiile關鍵字是怎麼實現變量可見性的?如果想要學好並發,弄懂理解透徹的話,凱哥覺得以下計算機的知識還是要了解了解。本次《Java並發編程-前期準備知識》凱哥準備用兩篇來介紹,主要包括以下內容:簡單介紹內存之間可見性是什麼?
  • JAVA學習之路(總結)--基礎篇二
    JAVA學習之路(總結)--基礎篇二是在基礎篇一上的延續,想看基礎篇一的同學們,可以關注一下我呦,在我的歷史發布就可以看到。喵~~~~喵~~~~喵~~~~先說一個題外話~~~大家學習java一方面是為了興趣,當然另一方更想著賺更多的Money吧,嘿嘿嘿~就深圳來講,Java程式設計師薪資水平一般如下:應屆生:普通5K左右,能力強8K左右;1年工作經驗:普通8K,能力強1W+;2年工作經驗:普通9K,能力強1.2W+;3年工作經驗:普通1.5W+,
  • 學習 Java 語言,你必須知道的 Java 簡史
    希望結合自己的知識體系和實踐經驗,產出 Java 學習的一系列教程,能夠幫助到對 Java 感興趣或者有志於從事 Java 程式設計師這個崗位的同學。學習一個東西,首先要知道它是什麼,基於什麼樣的背景下出現的,後續又是如何演變的。本文就簡要介紹下 Java 的歷史。
  • 2018年學習編程是學習JAVA好還是學習python好?
    2018年世界程式語言熱度排名python首次超出java,很多同學想學習編程,但是選擇哪門語言方面很糾結,過去幾年java一直排名第一,選擇java無話可說,新的熱度是不是會持續下去,Java還那麼吃香嗎?成為選擇的一個就節點。
  • Java 學習路線
    ,包括從基礎、到 C++ 入門、進階、提升的視頻、書籍推薦,這些都是我大學期間真實走過的路,還沒看過的,先看下上篇文章:1、Linux C/C++ 學習路線(已拿騰訊、百度 offer)公眾號、以及朋友圈下面留言,有不少讀者希望我寫一篇 Java 的學習路線,以及我對於 Java 方向的看法。
  • 學習筆記 | Java虛擬機第一篇
    大致分為三層:第一層:入口處為Class Files,即字節碼文件,首先需要使用類裝載系統(Class Loader SubSystem),主要作用就是字節碼文件加載過程中生成一個大的Class對象,過程中又分為加載
  • 架構師學習 java架構師學習需要具備哪些能力
    架構師學習 java架構師學習需要具備哪些能力2020/7/30 15:22:22 來源:法治中國 【字體:大 中 小】【收藏本頁】【列印】【關閉】核心提示:IT行業中沒有人對java不熟悉的,而java架構師是近年來很吃香的,想要進行架構師學習,需要專業的平臺進行系統性的學習才能掌握架構師必備的一些能力
  • 學好java,掌握java編程思想很重要!學習java分三步
    浮雲我是一個剛剛畢業的大學生,專業是學的java,但是由於在大學時期貪玩,打遊戲,導致專業技術不過關,因此,在做了一番思想鬥爭過後,我決定了在我所在的城市找了一個培訓學校,所以我也就從頭學習java了。
  • 一篇不到300字短文,帶你徹底理解Java並發包中CountDownLatch
    本篇文章主要介紹了Java並發包中CountDownLatch的作用、使用場景、使用中的注意事項以及其相關擴展內容,讓大家更好地去運用Java並發包中的並發工具類。這時候可以通過Java並發包中的Condition條件變量來實現,但是Java並發包中提供了更加方便直接的工具類——java.util.concurrent.CountDownLatch。CountDownLatch可以實現一個(或者多個)線程等待其他線程完成一組特定操作之後繼續運行,這組操作被稱為先決操作。
  • 學習java需要會哪些知識才能夠去應聘工作?
    第一天、java開發環境的搭建和第一個java程序的運行:jdk的安裝第一個java程序——hello worldjava的運行原理集成開發環境(IDE)介紹第二天、變量、數據類型和運算符:變量的聲明和數據類型基本數據類型的變量
  • Java基礎學習心得筆記
    對於很多只會C語言的初學者而言,面對java基礎語法學習,反而感覺很難,其實其中最大的問題不是語法難,而是一種編程思想的轉變。
  • 學習Java 從這些書開始吧
    學習Java就業時就意味著有不少選擇餘地的。的學習指導,以生動有趣而風靡。本書是根據學習理論所設計的,可以從學習程序語言的基礎開始一直到包括線程、網絡與分布式程序等項目。而且不只是讀死書,你還會玩遊戲、拼圖、解謎題以及以意想不到的方式與java交互。在這些活動中,你會寫出一堆真正的java程序,包括了一個船艦炮戰遊戲和一個網絡聊天程序。
  • Java學習心得--給初學者的一些建議
    java是跨平臺的,那又為何不試試在Linux下開發呢?這就是一種,逼迫自己的心態了。為了以後能夠順利的學習java的最新知識,或者是獲得其他技術的最新信息,我又開始逼迫自己做第二件事情,那便是閱讀英文原書。
  • 動力節點Java學院2021年Java學習路線圖最新出爐啦
    ,卻往往缺乏系統而全面的學習路線。動力節點深知同學們的學習困難,為此整理了一套最新的2021年新版學習路線圖,增加了目前企業最新應用技術,這套學習路線圖,只要你完成一半基本就可以找到很不錯的工作了,如果想要獲得高薪,那就努力學完它吧!第一階段:Javase基礎
  • 成都哪個java培訓學校好?轉行Java開發該如何學習?
    很多沒有接觸過java的朋友,在即將來臨的2020年可能想要學習java,但苦於不知道從何處入手,怎麼學習,因為java語言涉及的東西太多了,不是簡簡單單就能學會的,那麼,應該怎麼學習java呢?成都達內小編分享幾個學習步驟供大家參考一下!
  • 如何通過自學java找到工作?6年開發經驗工程師總結學習java方法
    第一:我覺得談架構是需要有資格的。如果你think in java或java核心技術這兩本書還有很多你不能理解 那麼你最好先把其中的一本看個滾瓜爛熟,再去看其他技術。你servlet用得很熟練了麼?如果沒有,那麼 struts你應該先停下來。
  • 如何快速學習Java?
    點擊上方「CSDN」,選擇「置頂公眾號」關鍵時刻,第一時間送達!【CSDN編者按】在各大程式語言學習榜單上,Java的入門難度不言而喻。除了要科學選擇一門適合自己的程式語言,還有沒有快速入門的方法呢?近期,我們整理了來自Quora上來自網友的回答,希望給予更多參考。
  • 學習java這個建議你一定得聽
    其中學習方法和理念特別重要,很多時候我們大多數人都樂忠於學習知識,卻很少有人能夠冷靜下來看待學習本身。因為是計算機專業,大學畢業後身邊很多同學都決定未來搞編程,當時畢業市面上最流行的就是java,用人單位要的多,也好找工作,於是我不少同學的方向都是java工程師。但大學計算機學到的知識並不精深。