死磕 java同步系列之開篇

来源:https://www.cnblogs.com/tong-yuan/archive/2019/05/14/Synchronize.html
-Advertisement-
Play Games

java中的同步器是指什麼? 哪些類是使用AQS實現的? 分散式環境中怎麼實現同步? ...


簡介

同步系列,這是彤哥想了好久的名字,本來是準備寫鎖相關的內容,但是java中的CountDownLatch、Semaphore、CyclicBarrier這些類又不屬於鎖,它們和鎖又有很多共同點,都是為了協同多線程的執行,都是一種同步器,所以這裡就借用同步來取名字了,也就是“同步系列”的來源。

概覽

這一篇的內容會比較多,大致包含三大主題:java中的鎖、同步器、分散式鎖,大致講的內容如下:

(1)volatile

(2)synchronized

(3)AQS及Condition

(4)ReentrantLock

(5)ReentrantReadWriteLock

(6)StampedLock

(7)CountDownLatch

(8)Semaphore

(9)CyclicBarrier

(10)Phaser

(11)Mysql實現分散式鎖

(12)Redis實現分散式鎖

(13)Zookeeper實現分佈鎖

這些內容都比較晦澀難懂,網上也有比較多的資料,但往往講得不夠透徹,彤哥會儘量用通俗易懂的語言把這些問題講清楚。

名詞解釋

關於鎖的名詞也有很多,彤哥大致整理了下,全部列到這裡:

(1)公平鎖/非公平鎖

公平鎖,是指按照線程申請的順序獲取鎖。

非公平鎖,是指不是按照線程申請的順序獲取鎖,有可能後申請的線程反而先獲取到鎖,假如先來的線程一直獲取不到鎖,會造成鎖饑餓現象。

ReentrantLock中可以通過構造方法指定是否為公平鎖,預設為非公平鎖,非公平鎖的優點在於吞吐量大。

synchronized無法指定為公平鎖,一直都是非公平鎖。

(2)可重入鎖

可重入鎖,是指一個線程獲取鎖之後再嘗試獲取鎖時會自動獲取鎖,可重入鎖的優點是避免死鎖。

ReentrantLock和synchronized都是可重入鎖。

(3)獨享鎖/共用鎖

獨享鎖,是指鎖一次只能被一個線程持有。

共用鎖,是指鎖一次可以被多個線程持有。

ReentrantLock和synchronized都是獨享鎖,ReadWriteLock的讀鎖是共用鎖,寫鎖是獨享鎖。

(4)互斥鎖/讀寫鎖

與獨享鎖/共用鎖的概念差不多,是獨享鎖/共用鎖的具體實現。

ReentrantLock和synchronized都是互斥鎖

ReadWriteLock是讀寫鎖

(5)樂觀鎖/悲觀鎖

悲觀鎖,是指認為對於同一個數據的併發操作必然會發生修改,即使不會發生修改也這麼認為,所以一定要加鎖。

樂觀鎖,是指認為對於同一個數據的併發操作不一定會發生修改,在更新數據的時候,嘗試去更新數據,如果失敗就不斷嘗試。

悲觀鎖適用於寫操作多的場景,樂觀鎖適用於讀操作多的場景。

(6)分段鎖

分段鎖,是一種鎖的設計思路,它細化了鎖的粒度,主要運用在ConcurrentHashMap中,實現高效的併發操作,當操作不需要更新整個數組時,就只鎖數組中的一項就可以了。

(7)偏向鎖/輕量級鎖/重量級鎖

這三個鎖主要是針對synchronized進行優化使用的,主要是通過對象監視器在對象頭中的欄位來表明的。

偏向鎖,是指一段同步代碼一直被一個線程訪問,那麼這個線程會自動獲取鎖,降低獲取鎖的代價。

輕量級鎖,是指當鎖是偏向鎖時,被另一個線程所訪問,偏向鎖會升級為輕量級鎖,這個線程會通過自旋的方式嘗試獲取鎖,不會阻塞,提高性能。

重量級鎖,是指當鎖是輕量級鎖時,當自旋的線程自旋了一定的次數後,還沒有獲取到鎖,就會進入阻塞狀態,該鎖升級為重量級鎖,重量級鎖會使其他線程阻塞,性能降低。

(8)自旋鎖

自旋鎖,是指嘗試獲取鎖的線程不會阻塞,而是迴圈的方式不斷嘗試,這樣的好處是減少線程的上下文切換帶來的開鎖,提高性能,缺點是迴圈會消耗CPU。

(9)監視器鎖

synchronized的實現方式,使用monitorenter和monitorexit來實現。

(10)mutex鎖

互斥鎖,LockSupport.part()底層是通過mutex實現的。

彩蛋

招募令:

因為彤哥本身工作也比較繁忙,很難做到日更,所以這裡誠邀廣大好友積極投稿,大家一起學習一起進步。

可在公眾號後臺給我留言“投稿”,互加好友詳細討論投稿內容。

當然,其它問題也可在公眾號後臺留言,不管是生活上、工作上、心理上還是身體上的,歡迎叨擾,留言必回。


歡迎關註我的公眾號“彤哥讀源碼”,查看更多源碼系列文章, 與彤哥一起暢游源碼的海洋。

qrcode


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 11.1 集合元素的映射-map映射操作 11.1.1 看一個實際需求 要求:請將List(3,5,8)中所有的元素都*2,將其結果放到一個新的集合中返回,即返回一個新的List(6,10,16),請編寫程式實現 11.1.2 map映射操作 11.1.3 使用傳統方法 -案例演示 -上述案例演示的 ...
  • 1. 十次方中的前端知識點隨記 好久沒上傳筆記了,主要最近的筆記都零零散散,知識點也不集中,就不傳了;最近項目想用到前後端分離,而且前端我也想參與下,就先基本的學一遍,記點零星的筆記,各位能從中看到有用的東西最好 1.1. Node.js 1.1.1. node基本使用 1. 查看 中文文檔地址 v ...
  • 2.1 註意不同類型轉換 2.2 2.3 2.4 使用 迴圈 每次對 個位 取數相加 取數後 除以10 使前一位 變為 個位 繼續 判斷小於等於0時停止 2.5 註意 System.currentTimeMillis()方法 返回 long 形 需要轉換為 int 形 2.6 a 不能為 0 b2 ...
  • 5.14自我總結 一.python插件插件相關技巧彙總 安裝在cmd上運行 二.PyCharm的安裝註意事項 1.激活碼 可以網上找 2.對於當中的Python的設置 對於python的路徑不能選擇系統預設,要手動輸入python.exe的路徑 3.字體設置以及快捷設置 點擊File→setting ...
  • 介紹 jar命令用來對*.class文件進行壓縮,從而生成jar(archive)歸檔文件,避免文件過多. 定義一個文件: 編譯後,生成包.類,然後將這個common包進行壓縮為jar文件.輸入下麵命令: 列印如下: 當我們想往my.jar添加其它包的時候,輸入: 如果想解壓jar包,則輸入: 當我 ...
  • 1、封裝類似lower()的函數 2、封裝類似upper()的函數 3、封裝類似find()的函數 4、封裝類似rfind()的函數 5、封裝功能類似isdigit()的函數 6、封裝功能類似partition()的函數 ...
  • day23 01 類的命名空間 一、初識面向對象複習 定義類: class 函數:方法 動態屬性 變數:類屬性 靜態屬性 過程: (1)_init_方法:初始化:def _init_(self,參數) python幫我們創建了一個對象self 每當我們調用類的時候就會自動觸發這個方法 在_init_ ...
  • 隨著動態語言的流行(Ruby,Groovy,Scala,Node.js),Java的開發顯得格外的笨重;繁多的配置,低下的開發效率,複雜的部署流程以及第三方技術集成難度大. 在上述環境 下,Spring Boot應運而生.它使用"習慣優於配置"(項目中存在大量的配置,此外還內置一個習慣性的配置,讓你 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...