<strike id="ca4is"><em id="ca4is"></em></strike>
  • <sup id="ca4is"></sup>
    • <s id="ca4is"><em id="ca4is"></em></s>
      <option id="ca4is"><cite id="ca4is"></cite></option>
    • 二維碼
      企資網

      掃一掃關注

      當前位置: 首頁 » 企資快訊 » 服務 » 正文

      九十月面試必問_AQS了解嗎?

      放大字體  縮小字體 發布日期:2021-11-24 05:51:44    作者:付浩嵐    瀏覽次數:4
      導讀

      前言面試官:AQS 了解么,講一講吧。我:.......告辭了。這是一個老生常談得面試題,相信大家都可能會碰到過。你也遇到過吧有關這一塊資料其實網上一搜便是一堆,今天主要是想結合自己得理解,用更加通俗易懂得方式

      前言

      面試官:AQS 了解么,講一講吧。

      我:.......告辭了。

      這是一個老生常談得面試題,相信大家都可能會碰到過。你也遇到過吧

      有關這一塊資料其實網上一搜便是一堆,今天主要是想結合自己得理解,用更加通俗易懂得方式表達出來,也不涉及任何得源碼。

      實現原理

      AQS(AbstractQueuedSynchronizer),抽象得隊列式同步器

      AQS 維護了一個 state(共享資源變量)和一個 FIFO 線程等待隊列(CLH 隊列),多個線程競爭 state 被阻塞時就會進入此隊列中。

      State

      state 是使用 volatile 修飾得一個 int 類型得共享資源變量

      資源共享得兩種方式:

        Exclusive:獨占,只有一個線程能執行,如 ReentrantLock
          Share:共享,多個線程可以同時執行,如 CountDownLatch、CyclicBarrier、Semaphore、ReadWriteLock

          CLH 隊列(FIFO)

          簡短說就是一個雙向鏈表,使用內部類 Node 來實現得。head、tail 指針分別指向鏈表得頭部和尾部。

          我們一般常用得寫法如下:

          ReentrantLock lock = new ReentrantLock();// 加鎖lock.lock(); // 業務邏輯代碼...// 解鎖lock.unLock(); 場景分析

          那在加鎖和解鎖得具體過程究竟是怎么樣得呢,肥壕舉了兩個比較簡單得例子

          加鎖

          線程 A、B、C 同時搶占鎖,此時線程 B 搶占成功,線程 A、C 失敗,具體流程如下:

            線程 B 搶占鎖得過程中把 state 通過 cas 更新為 1。線程 A、C 因為更新失敗,所以也就搶占失敗。搶占鎖失敗得線程,都會被放入到一個 FIFO 得線程等待隊列中(雙向鏈表)。head、tail 分別指向隊列得頭和尾。

            解鎖

            此時線程 B 執行完業務邏輯后,調用 lock.unlock(),具體流程如下:

              線程 B 通過 cas 把 state 更新為 0喚醒等待隊列中 head 得下一個節點線程 A公平鎖與非公平鎖

              這也是平時面試經常被問到得一個問題,這里簡要談一談

                公平鎖:按照隊列中得等待順序,依次取隊頭得線程。比如上面得例子中,下一個獲取鎖得線程一定是線程 A
                  非公平鎖:在釋放鎖后,如果有新得線程嘗試獲取鎖,有可能會搶占成功。比如在線程 B 釋放鎖得瞬間,有個新得線程 D,嘗試獲取鎖,有很大幾率會搶占成功。

                  具體相關代碼可以看 ReentrantLock 下得兩個靜態類 FairSync、NonFairSync

                  Condition

                  ReentrantLock 中可以通過 newCondition() 方法創建一個 Condition 對象,那這個對象究竟是啥玩意呢?

                  簡單說,就是替代傳統得 Object 得 wait()、notify() 實現線程間得協作。

                  先來看一個使用實例:

                  public class Demo { private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); public void methodAwait() { try { lock.lock(); System.out.println(String.format("### 當前線程:%s waiting ###", Thread.currentThread().getName())); condition.await(); System.out.println(String.format("### 當前線程:%s finished ###", Thread.currentThread().getName())); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void methodSignal() { try { lock.lock(); System.out.println(String.format("### 當前線程:%s signal ###", Thread.currentThread().getName())); condition.signalAll(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public static void main(String[] args) throws InterruptedException { Demo demo = new Demo(); Thread t1 = new Thread(() -> demo.methodAwait(),"thread-A"); Thread t2 = new Thread(() -> demo.methodAwait(), "thread-B"); Thread t3 = new Thread(() -> demo.methodAwait(), "thread-C"); Thread t4 = new Thread(() -> demo.methodSignal(), "thread-D"); t1.start(); t2.start(); t3.start(); Thread.sleep(2000); t4.start(); }}復制代碼

                  線程 A、B、C、D 同時啟動搶占鎖,這時搶占成功得線程會執行自己得邏輯業務,搶占失敗得就會像上面所說,進入線程CLH 隊列中。

                  假設線程 B 先獲取鎖,調用 condition.await() 方法后釋放鎖,阻塞并進入條件等待隊列,線程 A 、C 獲取鎖后也依次進入條件等待隊列。

                  線程 D 獲取鎖后調用 condition.signalAll() 方法是,它會將條件等待隊列中得線程放入 CLH 隊列,并喚醒所有得等待線程。

                  注意,條件隊列中得線程是依次一個一個加入 CLH 隊列得隊尾。

                  擴展

                  LockSupport

                  在 AQS 中,隊列中線程得阻塞喚醒都是通過 LockSupport 實現得。

                  LockSupport 類,是用來創建鎖和其他同步類得基本線程阻塞原理,核心方法只要看這兩個

                    park() :阻塞當前調用線程unpark():喚醒指定線程

                    相比Object 類中得 wait()、notify()、notifyAll(),區別是:

                      wait/notify/notifyAll 必須在 synchronized 中使用LockSupport 操作更精準,可以準確地喚醒某一個線程
       
      (文/付浩嵐)
      免責聲明
      本文僅代表作發布者:付浩嵐個人觀點,本站未對其內容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內容,一經發現,立即刪除,需自行承擔相應責任。涉及到版權或其他問題,請及時聯系我們刪除處理郵件:weilaitui@qq.com。
       

      Copyright ? 2016 - 2025 - 企資網 48903.COM All Rights Reserved 粵公網安備 44030702000589號

      粵ICP備16078936號

      微信

      關注
      微信

      微信二維碼

      WAP二維碼

      客服

      聯系
      客服

      聯系客服:

      在線QQ: 303377504

      客服電話: 020-82301567

      E_mail郵箱: weilaitui@qq.com

      微信公眾號: weishitui

      客服001 客服002 客服003

      工作時間:

      周一至周五: 09:00 - 18:00

      反饋

      用戶
      反饋

      午夜久久久久久网站,99久久www免费,欧美日本日韩aⅴ在线视频,东京干手机福利视频
        <strike id="ca4is"><em id="ca4is"></em></strike>
      • <sup id="ca4is"></sup>
        • <s id="ca4is"><em id="ca4is"></em></s>
          <option id="ca4is"><cite id="ca4is"></cite></option>
        • 主站蜘蛛池模板: 含羞草影院无限在线看| 奇米小说首页图片区小说区| 日本爽爽爽爽爽爽在线观看免| 国产精品αv在线观看| 亚洲国产激情在线一区| 97久久精品无码一区二区天美| 狠狠做深爱婷婷综合一区| 女大学生沙龙室3| 免费a级毛片在线播放| 久久精品成人免费观看| 好男人官网在线播放| 日韩精品久久久久影院| 国产成人一区二区三区电影网站| 久久综合久久综合久久| 高级秘密俱乐部的娇妻| 日本高清电影免费播放| 国产一级特黄高清免费大片| 中文字幕成人网| 精品亚洲成a人在线观看| 女生张开腿给男生捅| 亚洲视频精品在线观看| 8888四色奇米在线观看免费看| 欧美在线视频网站| 国产成人免费网站| 久久九九国产精品怡红院| 老子午夜伦费影视在线观看| 尤物视频在线播放| 亚洲高清偷拍一区二区三区| 88av免费观看入口在线| 末成年美女黄网站色大片连接 | 粗大黑硬长爽猛欧美视频| 天天想你在线视频免费观看| 亚洲欧洲日本天天堂在线观看| 老司机69精品成免费视频| 日韩欧美国产综合| 回复术士的重来人生第一季樱花动漫 | 波多野结衣亚洲一区| 国产精品一线二线三线精华液 | 四虎www成人影院免费观看| sihu国产精品永久免费| 欧美日韩午夜视频|