在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鎖實現的基本原理

Android編程精選 ? 來源:Android編程精選 ? 2023-05-29 10:11 ? 次閱讀

01 為什么要用鎖?

鎖-是為了解決并發操作引起的臟讀、數據不一致的問題。

02 鎖實現的基本原理

2.1、volatile

Java編程語言允許線程訪問共享變量, 為了確保共享變量能被準確和一致地更新,線程應該確保通過排他鎖單獨獲得這個變量。Java語言提供了volatile,在某些情況下比鎖要更加方便。

volatile在多處理器開發中保證了共享變量的“ 可見性”??梢娦缘囊馑际钱斠粋€線程修改一個共享變量時,另外一個線程能讀到這個修改的值。

8bdf22e2-fd52-11ed-90ce-dac502259ad0.jpg202209192321367221.png

結論:如果volatile變量修飾符使用恰當的話,它比synchronized的使用和執行成本更低,因為它不會引起線程上下文的切換和調度。

2.2、synchronized

synchronized通過鎖機制實現同步。

先來看下利用synchronized實現同步的基礎:Java中的每一個對象都可以作為鎖。

具體表現為以下3種形式。

對于普通同步方法,鎖是當前實例對象。

對于靜態同步方法,鎖是當前類的Class對象。

對于同步方法塊,鎖是Synchonized括號里配置的對象。

當一個線程試圖訪問同步代碼塊時,它首先必須得到鎖,退出或拋出異常時必須釋放鎖。

2.2.1 synchronized實現原理

synchronized是基于Monitor來實現同步的。

Monitor從兩個方面來支持線程之間的同步:

互斥執行

協作

1、Java 使用對象鎖 ( 使用 synchronized 獲得對象鎖 ) 保證工作在共享的數據集上的線程互斥執行。

2、使用 notify/notifyAll/wait 方法來協同不同線程之間的工作。

3、Class和Object都關聯了一個Monitor。

8bfd7490-fd52-11ed-90ce-dac502259ad0.jpg202209192321382042.png

Monitor 的工作機理

線程進入同步方法中。

為了繼續執行臨界區代碼,線程必須獲取 Monitor 鎖。如果獲取鎖成功,將成為該監視者對象的擁有者。任一時刻內,監視者對象只屬于一個活動線程(The Owner)

擁有監視者對象的線程可以調用 wait() 進入等待集合(Wait Set),同時釋放監視鎖,進入等待狀態。

其他線程調用 notify() / notifyAll() 接口喚醒等待集合中的線程,這些等待的線程需要重新獲取監視鎖后才能執行 wait() 之后的代碼。

同步方法執行完畢了,線程退出臨界區,并釋放監視鎖。

參考文檔:https://www.ibm.com/developerworks/cn/java/j-lo-synchronized

2.2.2 synchronized具體實現

1、同步代碼塊采用monitorenter、monitorexit指令顯式的實現。

2、同步方法則使用ACC_SYNCHRONIZED標記符隱式的實現。

通過實例來看看具體實現:

8c2173ea-fd52-11ed-90ce-dac502259ad0.jpg202209192321396333.png

javap編譯后的字節碼如下:

8c607a86-fd52-11ed-90ce-dac502259ad0.jpg202209192321405204.png

monitorenter

每一個對象都有一個monitor,一個monitor只能被一個線程擁有。當一個線程執行到monitorenter指令時會嘗試獲取相應對象的monitor,獲取規則如下:

如果monitor的進入數為0,則該線程可以進入monitor,并將monitor進入數設置為1,該線程即為monitor的擁有者。

如果當前線程已經擁有該monitor,只是重新進入,則進入monitor的進入數加1,所以synchronized關鍵字實現的鎖是可重入的鎖。

如果monitor已被其他線程擁有,則當前線程進入阻塞狀態,直到monitor的進入數為0,再重新嘗試獲取monitor。

monitorexit

只有擁有相應對象的monitor的線程才能執行monitorexit指令。每執行一次該指令monitor進入數減1,當進入數為0時當前線程釋放monitor,此時其他阻塞的線程將可以嘗試獲取該monitor。

2.2.3 鎖存放的位置

鎖標記存放在Java對象頭的Mark Word中。

8c814018-fd52-11ed-90ce-dac502259ad0.jpg202209192321419575.png

Java對象頭長度

8cb62260-fd52-11ed-90ce-dac502259ad0.jpg202209192321427846.png

32位JVM Mark Word 結構

8cd20d68-fd52-11ed-90ce-dac502259ad0.jpg202209192321437957.png

32位JVM Mark Word 狀態變化

8d144872-fd52-11ed-90ce-dac502259ad0.jpg202209192321457398.png

64位JVM Mark Word 結構

2.2.3 synchronized的鎖優化

JavaSE1.6為了減少獲得鎖和釋放鎖帶來的性能消耗,引入了“偏向鎖”和“輕量級鎖”。

在JavaSE1.6中,鎖一共有4種狀態,級別從低到高依次是:無鎖狀態、偏向鎖狀態、輕量級鎖狀態和重量級鎖狀態,這幾個狀態會隨著競爭情況逐漸升級。

鎖可以升級但不能降級,意味著偏向鎖升級成輕量級鎖后不能降級成偏向鎖。這種鎖升級卻不能降級的策略,目的是為了提高獲得鎖和釋放鎖的效率。

偏向鎖:

無鎖競爭的情況下為了減少鎖競爭的資源開銷,引入偏向鎖。

8d39aebe-fd52-11ed-90ce-dac502259ad0.jpg202209192321466679.png

輕量級鎖:

輕量級鎖所適應的場景是線程交替執行同步塊的情況。

8d39aebe-fd52-11ed-90ce-dac502259ad0.jpg2022091923214830110.png

鎖粗化 (Lock Coarsening):也就是減少不必要的緊連在一起的unlock,lock操作,將多個連續的鎖擴展成一個范圍更大的鎖。

鎖消除 (Lock Elimination):鎖削除是指虛擬機即時編譯器在運行時,對一些代碼上要求同步,但是被檢測到不可能存在共享數據競爭的鎖進行削除。

適應性自旋Adaptive Spinning):自適應意味著自旋的時間不再固定了,而是由前一次在同一個鎖上的自旋時間及鎖的擁有者的狀態來決定。如果在同一個鎖對象上,自旋等待剛剛成功獲得過鎖,并且持有鎖的線程正在運行中,那么虛擬機就會認為這次自旋也很有可能再次成功,進而它將允許自旋等待持續相對更長的時間,比如100個循環。另一方面,如果對于某個鎖,自旋很少成功獲得過,那在以后要獲取這個鎖時將可能省略掉自旋過程,以避免浪費處理器資源。

2.2.4 鎖的優缺點對比

8d855972-fd52-11ed-90ce-dac502259ad0.jpg2022091923214950111.png

2.3、CAS

CAS,在Java并發應用中通常指CompareAndSwap或CompareAndSet,即比較并交換。

1、CAS是一個原子操作,它比較一個內存位置的值并且只有相等時修改這個內存位置的值為新的值,保證了新的值總是基于最新信息計算的,如果有其他線程在這期間修改了這個值則CAS失敗。CAS返回是否成功或者內存位置原來的值用于判斷是否CAS成功。

2、JVM中的CAS操作是利用了處理器提供的CMPXCHG指令實現的。

優點:

競爭不大的時候系統開銷小。

缺點:

循環時間長開銷大。

ABA問題。

只能保證一個共享變量的原子操作。

03 Java中的鎖實現

3.1、隊列同步器(AQS)

隊列同步器AbstractQueuedSynchronizer(以下簡稱同步器),是用來構建鎖或者其他同步組件的基礎框架。

3.1.1、它使用了一個int成員變量表示同步狀態。

8da42992-fd52-11ed-90ce-dac502259ad0.jpg2022091923215056212.png

3.1.2、通過內置的FIFO雙向隊列來完成獲取鎖線程的排隊工作。

同步器包含兩個節點類型的應用,一個指向頭節點,一個指向尾節點,未獲取到鎖的線程會創建節點線程安全(compareAndSetTail)的加入隊列尾部。同步隊列遵循FIFO,首節點是獲取同步狀態成功的節點。

8dc0509a-fd52-11ed-90ce-dac502259ad0.jpg2022091923215155913.png

未獲取到鎖的線程將創建一個節點,設置到尾節點。如下圖所示:

8def1d12-fd52-11ed-90ce-dac502259ad0.jpg2022091923215254714.png

首節點的線程在釋放鎖時,將會喚醒后繼節點。而后繼節點將會在獲取鎖成功時將自己設置為首節點。如下圖所示:

8e0e3d14-fd52-11ed-90ce-dac502259ad0.jpg2022091923215350515.png

3.1.3、獨占式/共享式鎖獲取

獨占式:有且只有一個線程能獲取到鎖,如:ReentrantLock;

共享式:可以多個線程同時獲取到鎖,如:CountDownLatch;

獨占式

每個節點自旋觀察自己的前一節點是不是Header節點,如果是,就去嘗試獲取鎖。

8e49e8f0-fd52-11ed-90ce-dac502259ad0.jpg2022091923215449316.png

獨占式鎖獲取流程:

8e6dfede-fd52-11ed-90ce-dac502259ad0.jpg2022091923215549017.png

共享式:

共享式與獨占式的區別:

8ebfc534-fd52-11ed-90ce-dac502259ad0.jpg2022091923215682218.png

共享鎖獲取流程:

8ee1abe0-fd52-11ed-90ce-dac502259ad0.jpg2022091923215785919.png

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19286

    瀏覽量

    229853
  • 數據
    +關注

    關注

    8

    文章

    7030

    瀏覽量

    89038
  • 編程語言
    +關注

    關注

    10

    文章

    1945

    瀏覽量

    34740

原文標題:Java中的鎖原理、鎖優化、CAS、AQS,看這篇就對了!

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    步進電機基本原理

    本帖最后由 eehome 于 2013-1-5 09:48 編輯 步進電機基本原理
    發表于 08-16 16:17

    串聯諧振逆變器的基本原理

    串聯諧振通常伴有逆變器。該組合稱為串聯諧振逆變器。什么是基本原理?讓我簡要介紹串聯諧振逆變器的一些基本原理。]首先給你看一張圖片:
    發表于 11-07 10:21

    電流檢測電阻的基本原理

    電流檢測電阻的基本原理簡單采樣電路的實現
    發表于 01-29 06:26

    電機轉動的基本原理是什么?

    電機轉動的基本原理是什么?電機運動的基本原則有哪些?
    發表于 07-21 07:59

    線性電源的基本原理是什么

    多路線性電源 AC-DC穩壓電源 低紋波電源 可調線性電源 原理圖PCB目錄多路線性電源 AC-DC穩壓電源 低紋波電源 可調線性電源 原理圖PCB基本原理芯片選型原理圖&3D-PCB具體
    發表于 07-30 07:47

    無線充電的基本原理是什么

    一 、無線充電基本原理無線充電的基本原理就是我們平時常用的開關電源原理,區別在于沒有磁介質耦合,那么我們需要利用磁共振的方式提高耦合效率,具體方法是在發送端和接收端線圈串并聯電容,是發送線圈處理諧振
    發表于 09-15 06:01

    RAID技術的基本原理是什么

    RAID技術的基本原理是什么?RAID技術有哪幾個優勢?
    發表于 10-14 12:01

    PWM控制的基本原理是什么

    PWM控制的基本原理是什么?如何讓逆變器輸出為等幅矩形波呢?如何實現低通濾波器呢?
    發表于 10-22 07:06

    DA0832實現DA轉換的基本原理是什么

    1、描述DA0832實現DA轉換的基本原理1、DAC0832是一個八位D/A轉換器,D/A轉換電路是一個R-2RT型電阻網絡,可實現8位數據的轉換。2、數據總線——DI7~DI0:轉換數據輸入控制
    發表于 11-26 08:27

    串口通信的基本原理是什么?

    同步通信和異步通信的區別是什么?串口通信的基本原理是什么?
    發表于 12-13 06:46

    PDB基本原理是什么

    PDB基本原理1.Programmable delay block (PDB)的邏輯框圖2.核心功能實現2.1.輸入trigger的選擇2.2.trigger和pre-trigger的輸出
    發表于 01-13 08:29

    步進馬達基本原理

    步進馬達基本原理步進馬達基本原理步進馬達基本原理
    發表于 11-30 11:55 ?8次下載

    Redis Cluster的基本原理實現細節

    Redis Cluster的基本原理和架構 Redis Cluster是分布式Redis的實現。隨著Redis版本的更替,以及各種已知bug的fixed,在穩定性和高可用性上有了很大的提升和進步
    發表于 09-28 19:09 ?0次下載
    Redis Cluster的<b class='flag-5'>基本原理</b>及<b class='flag-5'>實現</b>細節

    分布式基本原理和案例實現

    前面我們有聊過樂觀和悲觀實現,均是對于單體架構的場景下的實現。那么現在我們來總結看下分布式情況下如何實現
    的頭像 發表于 07-01 14:53 ?3339次閱讀
    分布式<b class='flag-5'>鎖</b>的<b class='flag-5'>基本原理</b>和案例<b class='flag-5'>實現</b>

    RNN的基本原理實現

    RNN,即循環神經網絡(Recurrent Neural Network),是一種特殊類型的人工神經網絡,專門設計用于處理序列數據,如文本、語音、視頻等。以下是對RNN基本原理實現的介紹: 一
    的頭像 發表于 11-15 09:49 ?438次閱讀
    主站蜘蛛池模板: 最近2018中文字幕免费视频| 亚洲人免费视频| 久久国产精品岛国搬运工| 92香蕉视频| 一区二区三区影院| 免费的日本网站| 五月天狠狠操| 91三级视频| 国产精品丝袜xxxxxxx| 香蕉视频vip| 国产欧美一区二区三区观看| 一个色综合网站| sis色中色| 色播五月综合| 亚洲精品视频在线| 一本到卡二卡三卡福利| 亚洲婷婷国产精品电影人久久| 靠比久久| 久久久免费观看| 一级做a爱片在线播放| 狠狠色噜噜狠狠狠狠奇米777| 久久香蕉国产线看观看亚洲片| 国色天香网在线| 加勒比色综合| 天天插综合网| 黄色插插插| 河南毛片| 在线视频网址| 色播视频在线观看免费| 天天做天天爱天天一爽一毛片| 亚洲欧美视频| 久久精品1| 1024亚洲视频| 日本xxxx色视频在线观看免费| 手机午夜看片| 一级毛片在线免费视频| 成人18毛片| 亚洲韩国欧美一区二区三区| 美国一级毛片免费看成人| 国产一级在线观看| 色综合中文网|