1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      Java中synchronized關(guān)鍵字的使用方法

      這篇文章將為大家詳細(xì)講解有關(guān)Java中synchronized關(guān)鍵字的使用方法,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

      成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比向陽網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式向陽網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋向陽地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。

                                                                 

      在并發(fā)編程中,synchronized關(guān)鍵字是常出現(xiàn)的角色。之前我們都稱呼synchronized關(guān)鍵字為重量鎖,但是在JDK1.6中對synchronized進(jìn)行了優(yōu)化,引入了偏向鎖、輕量鎖。本篇介紹synchronized關(guān)鍵字的使用方式,區(qū)別和偏向鎖、輕量鎖和重量鎖實(shí)現(xiàn)原理。

      先看看synchronized關(guān)鍵字的4種用法。

      1、修飾普通方法

      private synchronized void synMethod(){
      }

      這種用法中,synchronized鎖的對象實(shí)例。

      2、修飾靜態(tài)方法

      private static synchronized void synMethod(){
      }

      synchronized在這種情況下,鎖的是當(dāng)前Class類對象。

      3、同步方法塊

      private  void synMethod1(){
              synchronized(this){
                  
              }
          }    
          private  void synMethod2(){
              synchronized(ThreadTest.class){
                  
              }
          }

      synMethod1中鎖對象實(shí)例;synMethod2的是當(dāng)前Class類對象。

      再介紹鎖原理

      在介紹鎖原理之前,先認(rèn)識(shí)一下Java對象頭Mark Word,以32位為例。

      鎖狀態(tài)

      25 bit

      4bit

      1bit

      2bit

      23bit

      2bit

      是否偏向鎖

      鎖標(biāo)志位

      輕量級鎖

      指向棧中鎖記錄的指針

      0

      重量級鎖

      指向互斥量(重量級鎖)的指針

      10

      GC標(biāo)記

      11

      偏向鎖

      線程ID

      Epoch

      對象分代年齡

      1

      01

      無鎖

      對象的hashCode

      對象分代年齡

      0

      01

      上面的表格中,描述的是對象在每個(gè)鎖狀態(tài)時(shí),對象頭中所存儲(chǔ)的信息。

      1、偏向鎖

      實(shí)際環(huán)境中,線程在訪問同步塊時(shí),如果沒有其他線程對鎖進(jìn)行競爭,并且由同一個(gè)線程多次獲得鎖,也就是單線程運(yùn)行同步代碼,在這種情況下,若是每次還阻塞線程,就代表白白浪費(fèi)CPU性能。這種情況下,引入了偏向鎖概念。

      Java中synchronized關(guān)鍵字的使用方法

      • 訪問同步代碼塊

      • 判斷對象頭Mark Word中存儲(chǔ)的線程ID是否指向當(dāng)前線程,如果是,則表明當(dāng)前是鎖的重入,不需要再獲得鎖,直接執(zhí)行同步代碼

      • 如果不是,則嘗試使用CAS算法將線程ID更新至對象頭中。

      • 成功,獲得鎖,執(zhí)行同步代碼。更新失敗表明存在鎖競爭,等待全局安全點(diǎn),暫停擁有偏向鎖的線程,根據(jù)對象頭的鎖標(biāo)志位,選擇將偏向鎖升級為輕量鎖或者置為無鎖。

       可以使用-XX:-userBiasedLocking=false來關(guān)閉JVM偏向鎖優(yōu)化,默認(rèn)直接進(jìn)入輕量鎖。

      2、輕量鎖

      Java中synchronized關(guān)鍵字的使用方法

      • 訪問同步代碼塊時(shí),先在當(dāng)前線程的線程棧中創(chuàng)建一個(gè)鎖記錄(Lock Record)區(qū)域。

      • 把對象頭Mark Word拷貝到Lock Record中。

      • 利用CAS嘗試將對象頭Mark Word中的線程指針更新為指向當(dāng)前線程的指針

      • 更新成功,則獲得輕量鎖。

      • 更新失敗,檢查Mark Word中的指針是否指向當(dāng)前線程。

      • 如果是,則說明是鎖的重入現(xiàn)象。執(zhí)行同步代碼塊

      • 如果不是,則說明此時(shí)存在競爭。需要把輕量鎖膨脹為重量鎖。

      3、重量鎖

      重量鎖是基于對象監(jiān)視器(Monitor)來實(shí)現(xiàn)的。

      Java中synchronized關(guān)鍵字的使用方法

      線程在執(zhí)行同步代碼時(shí),需要調(diào)用一個(gè)Monitor.enter指令。執(zhí)行退出后,調(diào)用Monitor.exit指令。這里看得出,監(jiān)視器具有排它性,一個(gè)時(shí)間點(diǎn)只能有一個(gè)線程enter成功,其他線程只能阻塞在隊(duì)列中。所以這種重量鎖的操作成本很高。

      關(guān)于Java中synchronized關(guān)鍵字的使用方法就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。


      當(dāng)前標(biāo)題:Java中synchronized關(guān)鍵字的使用方法
      當(dāng)前路徑:http://ef60e0e.cn/article/psppdp.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        庆城县| 昌乐县| 沂源县| 扶余县| 申扎县| 潜山县| 浮梁县| 蓝田县| 海安县| 嵊泗县| 牡丹江市| 平原县| 云霄县| 丽水市| 泸水县| 龙门县| 类乌齐县| 武隆县| 郸城县| 琼中| 永顺县| 华安县| 郁南县| 托克逊县| 安泽县| 南投县| 额济纳旗| 郁南县| 苏尼特左旗| 曲靖市| 卓尼县| 威宁| 鄯善县| 文化| 朝阳市| 清河县| 伊川县| 祁阳县| 石柱| 囊谦县| 富蕴县|