国产一区二区三区四区在线观看 _欧美日韩国产高清一区_精品成人佐山爱一区二区_国产精品一卡二

二維碼
企資網(wǎng)

掃一掃關(guān)注

當(dāng)前位置: 首頁(yè) » 企資快訊 » 服務(wù) » 正文

九十月面試必問(wèn)_AQS了解嗎?

放大字體  縮小字體 發(fā)布日期:2021-11-24 05:51:44    作者:付浩嵐    瀏覽次數(shù):19
導(dǎo)讀

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

前言

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

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

這是一個(gè)老生常談得面試題,相信大家都可能會(huì)碰到過(guò)。你也遇到過(guò)吧

有關(guān)這一塊資料其實(shí)網(wǎng)上一搜便是一堆,今天主要是想結(jié)合自己得理解,用更加通俗易懂得方式表達(dá)出來(lái),也不涉及任何得源碼。

實(shí)現(xiàn)原理

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

AQS 維護(hù)了一個(gè) state(共享資源變量)和一個(gè) FIFO 線程等待隊(duì)列(CLH 隊(duì)列),多個(gè)線程競(jìng)爭(zhēng) state 被阻塞時(shí)就會(huì)進(jìn)入此隊(duì)列中。

State

state 是使用 volatile 修飾得一個(gè) int 類(lèi)型得共享資源變量

資源共享得兩種方式:

    Exclusive:獨(dú)占,只有一個(gè)線程能執(zhí)行,如 ReentrantLock
      Share:共享,多個(gè)線程可以同時(shí)執(zhí)行,如 CountDownLatch、CyclicBarrier、Semaphore、ReadWriteLock

      CLH 隊(duì)列(FIFO)

      簡(jiǎn)短說(shuō)就是一個(gè)雙向鏈表,使用內(nèi)部類(lèi) Node 來(lái)實(shí)現(xiàn)得。head、tail 指針?lè)謩e指向鏈表得頭部和尾部。

      我們一般常用得寫(xiě)法如下:

      ReentrantLock lock = new ReentrantLock();// 加鎖lock.lock(); // 業(yè)務(wù)邏輯代碼...// 解鎖lock.unLock(); 場(chǎng)景分析

      那在加鎖和解鎖得具體過(guò)程究竟是怎么樣得呢,肥壕舉了兩個(gè)比較簡(jiǎn)單得例子

      加鎖

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

        線程 B 搶占鎖得過(guò)程中把 state 通過(guò) cas 更新為 1。線程 A、C 因?yàn)楦率。砸簿蛽屨际 屨兼i失敗得線程,都會(huì)被放入到一個(gè) FIFO 得線程等待隊(duì)列中(雙向鏈表)。head、tail 分別指向隊(duì)列得頭和尾。

        解鎖

        此時(shí)線程 B 執(zhí)行完業(yè)務(wù)邏輯后,調(diào)用 lock.unlock(),具體流程如下:

          線程 B 通過(guò) cas 把 state 更新為 0喚醒等待隊(duì)列中 head 得下一個(gè)節(jié)點(diǎn)線程 A公平鎖與非公平鎖

          這也是平時(shí)面試經(jīng)常被問(wèn)到得一個(gè)問(wèn)題,這里簡(jiǎn)要談一談

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

              具體相關(guān)代碼可以看 ReentrantLock 下得兩個(gè)靜態(tài)類(lèi) FairSync、NonFairSync

              Condition

              ReentrantLock 中可以通過(guò) newCondition() 方法創(chuàng)建一個(gè) Condition 對(duì)象,那這個(gè)對(duì)象究竟是啥玩意呢?

              簡(jiǎn)單說(shuō),就是替代傳統(tǒng)得 Object 得 wait()、notify() 實(shí)現(xiàn)線程間得協(xié)作。

              先來(lái)看一個(gè)使用實(shí)例:

              public class Demo { private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); public void methodAwait() { try { lock.lock(); System.out.println(String.format("### 當(dāng)前線程:%s waiting ###", Thread.currentThread().getName())); condition.await(); System.out.println(String.format("### 當(dāng)前線程:%s finished ###", Thread.currentThread().getName())); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void methodSignal() { try { lock.lock(); System.out.println(String.format("### 當(dāng)前線程:%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(); }}復(fù)制代碼

              線程 A、B、C、D 同時(shí)啟動(dòng)搶占鎖,這時(shí)搶占成功得線程會(huì)執(zhí)行自己得邏輯業(yè)務(wù),搶占失敗得就會(huì)像上面所說(shuō),進(jìn)入線程CLH 隊(duì)列中。

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

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

              注意,條件隊(duì)列中得線程是依次一個(gè)一個(gè)加入 CLH 隊(duì)列得隊(duì)尾。

              擴(kuò)展

              LockSupport

              在 AQS 中,隊(duì)列中線程得阻塞喚醒都是通過(guò) LockSupport 實(shí)現(xiàn)得。

              LockSupport 類(lèi),是用來(lái)創(chuàng)建鎖和其他同步類(lèi)得基本線程阻塞原理,核心方法只要看這兩個(gè)

                park() :阻塞當(dāng)前調(diào)用線程unpark():?jiǎn)拘阎付ň€程

                相比Object 類(lèi)中得 wait()、notify()、notifyAll(),區(qū)別是:

                  wait/notify/notifyAll 必須在 synchronized 中使用LockSupport 操作更精準(zhǔn),可以準(zhǔn)確地喚醒某一個(gè)線程
 
(文/付浩嵐)
免責(zé)聲明
本文僅代表作發(fā)布者:付浩嵐個(gè)人觀點(diǎn),本站未對(duì)其內(nèi)容進(jìn)行核實(shí),請(qǐng)讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問(wèn)題,請(qǐng)及時(shí)聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
 

Copyright ? 2016 - 2025 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號(hào)

粵ICP備16078936號(hào)

微信

關(guān)注
微信

微信二維碼

WAP二維碼

客服

聯(lián)系
客服

聯(lián)系客服:

在線QQ: 303377504

客服電話: 020-82301567

E_mail郵箱: weilaitui@qq.com

微信公眾號(hào): weishitui

客服001 客服002 客服003

工作時(shí)間:

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

主站蜘蛛池模板: 国产精品久久亚洲| 日韩在线中文视频| 无码日韩人妻精品久久蜜桃V | 色综合五月天导航| 久久久亚洲精品无码| av免费观看国产| 久久av免费一区| 国内精品久久久久伊人av| 日本精品中文字幕| 91极品视频在线| 国产精品欧美风情| 亚洲综合色激情五月| 久久九九免费视频| 欧美在线中文字幕| 久久久久国色av免费观看性色| 亚洲在线不卡| 国产精品天天狠天天看| 国产精品美女xx| 国产色综合天天综合网| 国产精品久久精品| 日本国产高清不卡| 久久91精品国产91久久久| 国产精品久久久久久久7电影 | 视频一区免费观看| 久久国产精品精品国产色婷婷| 日韩中文字幕在线免费观看| 日韩av一区二区三区在线| 国产激情综合五月久久| 欧美极品在线视频| 91精品国产综合久久久久久蜜臀| 国产中文欧美精品| 国产精品∨欧美精品v日韩精品| 国产综合香蕉五月婷在线| 国产精品露脸av在线| 蜜臀精品一区二区| 少妇久久久久久被弄到高潮| 欧美亚洲国产视频小说| 欧美精品久久久久久久免费| 国产自产在线视频一区| 欧美久久久久久V| 青青青青在线视频|