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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java锁以及双重检查

發布時間:2023/12/10 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java锁以及双重检查 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

雙檢鎖/雙重校驗鎖 雙層對空判斷困擾了很久。實例

public class Singleton {private volatile static Singleton singleton;//私有構造函數避免調用private Singleton (){}public static Singleton getSingleton() {// 先判斷對象是否創建過if (singleton == null) {//類對象加鎖synchronized (Singleton.class) {if (singleton == null) {singleton = new Singleton();//字節碼層//JIT CPU 可能對如下指令進行重排序// 1.分配空間// 2.初始化// 3.引用賦值如果指令重排后指令如下://1.分配空間//3.引用賦值 如果在當前指令執行完后,有其他線程獲取到實例,將拿到未初始化的實例;//2. 初始化}}}return singleton;} }


解釋:當A與B同時調用getSingleton時,判斷第一個if都為空,這時A拿到鎖,進行第二層if判斷,條件成立new了一個對象;

B在外層等待,A創建完成,釋放鎖,B拿到鎖,進行第二層if判斷,條件不成立,結束釋放鎖。C調用getSingleton時第一層判斷不成立,直接拿到singleton對象返回,避免進入鎖,減少性能開銷。

進一步理解:其中兩次判空,第一次判空是,減少多線程情況下,進入同步代碼塊的次數,第二次判空,是防止多線程(A,B兩種線程的情況下A,B 同時調用了 getSingleton 方法,都同時,進入到第一層if(singleton==null){} 內,競態條件下,如果A 拿到了對象鎖,進入到同步代碼塊,B阻塞等待,等待創建了實例對象,釋放了鎖后,B進入同步代碼塊,但是此時第二層if(singleton==null){} 判斷,singleton 不為空,直接返回singleton);

總結:其中有兩次判斷是否為空的語句,第一次是為了提高效率,避免每次都要執行同步代碼塊,第二次判空,是為了避免多線程帶來的不安全,當兩個線程同時對第一個判斷為空時,均會先后進入同步代碼塊,此時,若沒有第二個判空條件,則會引來創建多個實例。

volite 關鍵字:

采用volatile關鍵字修飾很有必要

這句代碼事實上是分三步:

singleton?= new Singleton();

  • 為singleton?分配內存空間
  • 初始化singleton?
  • 將singleton?指向分配的內存地址
    但是,jvm會有指令重排的特性,執行順序有可能改變,不是按照123的順序,可能是132,這樣就會導致一個線程獲得沒有初始化的實例
    如:t1執行了13,此時t2調用了getInstance()后發現singleton?已經不為空了,因此返回singleton?,但是這時singleton?還沒有被初始化
    volatile就可以禁止jvm的指令重排,保證在多線程環境下也能正常運行
  • 想進一步了解:推薦

    深入理解Java并發之synchronized實現原理

    https://blog.csdn.net/javazejian/article/details/72828483

    ?

    參考:

    https://blog.csdn.net/jlnu0812407/article/details/102836187

    https://blog.csdn.net/faye_1008/article/details/90296173

    總結

    以上是生活随笔為你收集整理的java锁以及双重检查的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。