精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java多線程八股文背誦版V0.2

開發(fā) 后端
java內(nèi)存模型定義了程序中各種變量的訪問規(guī)則。其規(guī)定所有變量都存儲(chǔ)在主內(nèi)存,線程均有自己的工作內(nèi)存。工作內(nèi)存中保存被該線程使用的變量的主內(nèi)存副本,線程對(duì)變量的所有操作都必須在工作空間進(jìn)行,不能直接讀寫主內(nèi)存數(shù)據(jù)。

[[417056]]

本文轉(zhuǎn)載自微信公眾號(hào)「后端技術(shù)小牛說」,作者后端技術(shù)小牛說。轉(zhuǎn)載本文請(qǐng)聯(lián)系后端技術(shù)小牛說公眾號(hào)。

寫在最前面

最近有收到讀者的一些反饋,感謝了我開發(fā)了網(wǎng)站interviewtop.top,對(duì)他們面試產(chǎn)生了巨大幫助,更有讀者給我發(fā)了小紅包贊助我。當(dāng)然啦,我也知道大家還是以學(xué)生群體為主,紅包和贊助免了哈!

我之前還是學(xué)生身份,分別租了阿里云騰訊云等等云服務(wù)器的9.9元學(xué)生套餐,利用各個(gè)廠的學(xué)生福利云服務(wù)器負(fù)載均衡做服務(wù)器后端,這幾個(gè)月,由于已經(jīng)成為社會(huì)人了,當(dāng)然沒這點(diǎn)福利了(9.9同等配置社會(huì)人現(xiàn)在得近200,所以還在上學(xué)的同學(xué)有需求這個(gè)羊毛可以薅一把)。而且隨著大家使用頻率的增高,配置要求當(dāng)然也不一定打的住了。

除此之外,interviewtop網(wǎng)站也需要大家的幫助和支持!如果大家有面經(jīng),希望大家能貢獻(xiàn)一下:

在全部和對(duì)應(yīng)題庫(kù)下點(diǎn)擊搜索

搜索自己的面試題

點(diǎn)擊這題我面試見過,貢獻(xiàn)一下自己的面試經(jīng)歷

如果有些題題庫(kù)沒收錄,歡迎大家添加小牛微信,小牛后臺(tái)更新上!

簡(jiǎn)述java內(nèi)存模型(JMM)

java內(nèi)存模型定義了程序中各種變量的訪問規(guī)則。其規(guī)定所有變量都存儲(chǔ)在主內(nèi)存,線程均有自己的工作內(nèi)存。工作內(nèi)存中保存被該線程使用的變量的主內(nèi)存副本,線程對(duì)變量的所有操作都必須在工作空間進(jìn)行,不能直接讀寫主內(nèi)存數(shù)據(jù)。操作完成后,線程的工作內(nèi)存通過緩存一致性協(xié)議將操作完的數(shù)據(jù)刷回主存。

簡(jiǎn)述as-if-serial

編譯器等會(huì)對(duì)原始的程序進(jìn)行指令重排序和優(yōu)化。但不管怎么重排序,其結(jié)果和用戶原始程序輸出預(yù)定結(jié)果一致。

簡(jiǎn)述happens-before八大原則

程序次序規(guī)則:一個(gè)線程內(nèi)寫在前面的操作先行發(fā)生于后面的。

鎖定規(guī)則:unlock 操作先行發(fā)生于后面對(duì)同一個(gè)鎖的 lock 操作。

volatile 規(guī)則:對(duì) volatile 變量的寫操作先行發(fā)生于后面的讀操作。

線程啟動(dòng)規(guī)則:線程的 start 方法先行發(fā)生于線程的每個(gè)動(dòng)作。

線程中斷規(guī)則:對(duì)線程interrupt()方法的調(diào)用先行發(fā)生于被中斷線程的代碼檢測(cè)到中斷事件的發(fā)生。

線程終止規(guī)則:線程中所有操作先行發(fā)生于對(duì)線程的終止檢測(cè)。

對(duì)象終結(jié)規(guī)則:對(duì)象的初始化先行發(fā)生于 finalize 方法。

傳遞性規(guī)則:如果操作 A 先行發(fā)生于操作 B,操作 B 先行發(fā)生于操作 C,那么操作 A 先行發(fā)生于操作 C

as-if-serial 和 happens-before 的區(qū)別

as-if-serial 保證單線程程序的執(zhí)行結(jié)果不變,happens-before 保證正確同步的多線程程序的執(zhí)行結(jié)果不變。

簡(jiǎn)述原子性操作

一個(gè)操作或者多個(gè)操作,要么全部執(zhí)行并且執(zhí)行的過程不會(huì)被任何因素打斷,要么就都不執(zhí)行,這就是原子性操作。

簡(jiǎn)述線程的可見性

可見性指當(dāng)一個(gè)線程修改了共享變量時(shí),其他線程能夠立即得知修改。volatile,synchronized,final都能保證可見性。

簡(jiǎn)述有序性

即雖然多線程存在并發(fā)和指令優(yōu)化等操作,在本線程內(nèi)觀察該線程的所有執(zhí)行操作是有序的。

簡(jiǎn)述java中volatile關(guān)鍵字作用

保證變量對(duì)所有線程的可見性。當(dāng)一條線程修改了變量值,新值對(duì)于其他線程來(lái)說是立即可以得知的。

禁止指令重排序優(yōu)化。使用 volatile 變量進(jìn)行寫操作,匯編指令帶有 lock 前綴,相當(dāng)于一個(gè)內(nèi)存屏障,編譯器不會(huì)將后面的指令重排到內(nèi)存屏障之前。

java線程的實(shí)現(xiàn)方式

  • 實(shí)現(xiàn)Runnable接口
  • 繼承Thread類。
  • 實(shí)現(xiàn)Callable接口

簡(jiǎn)述java線程的狀態(tài)

線程狀態(tài)有New, RUNNABLE, BLOCK, WAITING, TIMED_WAITING, THERMINATED NEW:新建狀態(tài),線程被創(chuàng)建且未啟動(dòng),此時(shí)還未調(diào)用 start 方法。

RUNNABLE: 運(yùn)行狀態(tài)。其表示線程正在JVM中執(zhí)行,但是這個(gè)執(zhí)行,不一定真的在跑,也可能在排隊(duì)等CPU。

BLOCKED:阻塞狀態(tài)。線程等待獲取鎖,鎖還沒獲得。

WAITING: 等待狀態(tài)。線程內(nèi)run方法運(yùn)行完語(yǔ)句Object.wait()/Thread.join()進(jìn)入該狀態(tài)。

TIMED_WAITING:限期等待。在一定時(shí)間之后跳出狀態(tài)。調(diào)用Thread.sleep(long) Object.wait(long) Thread.join(long)進(jìn)入狀態(tài)。其中這些參數(shù)代表等待的時(shí)間。

TERMINATED:結(jié)束狀態(tài)。線程調(diào)用完run方法進(jìn)入該狀態(tài)。

簡(jiǎn)述線程通信的方式

  1. volatile 關(guān)鍵詞修飾變量,保證所有線程對(duì)變量訪問的可見性。
  2. synchronized關(guān)鍵詞。確保多個(gè)線程在同一時(shí)刻只能有一個(gè)處于方法或同步塊中。
  3. wait/notify方法
  4. IO通信

簡(jiǎn)述線程池

沒有線程池的情況下,多次創(chuàng)建,銷毀線程開銷比較大。如果在開辟的線程執(zhí)行完當(dāng)前任務(wù)后執(zhí)行接下來(lái)任務(wù),復(fù)用已創(chuàng)建的線程,降低開銷、控制最大并發(fā)數(shù)。

線程池創(chuàng)建線程時(shí),會(huì)將線程封裝成工作線程 Worker,Worker 在執(zhí)行完任務(wù)后還會(huì)循環(huán)獲取工作隊(duì)列中的任務(wù)來(lái)執(zhí)行。

將任務(wù)派發(fā)給線程池時(shí),會(huì)出現(xiàn)以下幾種情況

核心線程池未滿,創(chuàng)建一個(gè)新的線程執(zhí)行任務(wù)。

如果核心線程池已滿,工作隊(duì)列未滿,將線程存儲(chǔ)在工作隊(duì)列。

如果工作隊(duì)列已滿,線程數(shù)小于最大線程數(shù)就創(chuàng)建一個(gè)新線程處理任務(wù)。

如果超過大小線程數(shù),按照拒絕策略來(lái)處理任務(wù)。

線程池參數(shù)

  1. corePoolSize:常駐核心線程數(shù)。超過該值后如果線程空閑會(huì)被銷毀。
  2. maximumPoolSize:線程池能夠容納同時(shí)執(zhí)行的線程最大數(shù)。
  3. keepAliveTime:線程空閑時(shí)間,線程空閑時(shí)間達(dá)到該值后會(huì)被銷毀,直到只剩下 corePoolSize 個(gè)線程為止,避免浪費(fèi)內(nèi)存資源。
  4. workQueue:工作隊(duì)列。
  5. threadFactory:線程工廠,用來(lái)生產(chǎn)一組相同任務(wù)的線程。
  6. handler:拒絕策略。有以下幾種拒絕策略:
  • AbortPolicy:丟棄任務(wù)并拋出異常
  • CallerRunsPolicy:重新嘗試提交該任務(wù)
  • DiscardOldestPolicy 拋棄隊(duì)列里等待最久的任務(wù)并把當(dāng)前任務(wù)加入隊(duì)列
  • DiscardPolicy 表示直接拋棄當(dāng)前任務(wù)但不拋出異常。

線程池創(chuàng)建方法

newFixedThreadPool,創(chuàng)建固定大小的線程池。

newSingleThreadExecutor,使用單線程線程池。

newCachedThreadPool,maximumPoolSize 設(shè)置為 Integer 最大值,工作完成后會(huì)回收工作線程

newScheduledThreadPool:支持定期及周期性任務(wù)執(zhí)行,不回收工作線程。

newWorkStealingPool:一個(gè)擁有多個(gè)任務(wù)隊(duì)列的線程池。

簡(jiǎn)述Executor框架

Executor框架目的是將任務(wù)提交和任務(wù)如何運(yùn)行分離開來(lái)的機(jī)制。用戶不再需要從代碼層考慮設(shè)計(jì)任務(wù)的提交運(yùn)行,只需要調(diào)用Executor框架實(shí)現(xiàn)類的Execute方法就可以提交任務(wù)。產(chǎn)生線程池的函數(shù)ThreadPoolExecutor也是Executor的具體實(shí)現(xiàn)類。

簡(jiǎn)述Executor的繼承關(guān)系

  • Executor:一個(gè)接口,其定義了一個(gè)接收Runnable對(duì)象的方法executor,該方法接收一個(gè)Runable實(shí)例執(zhí)行這個(gè)任務(wù)。
  • ExecutorService:Executor的子類接口,其定義了一個(gè)接收Callable對(duì)象的方法,返回 Future 對(duì)象,同時(shí)提供execute方法。
  • ScheduledExecutorService:ExecutorService的子類接口,支持定期執(zhí)行任務(wù)。
  • AbstractExecutorService:抽象類,提供 ExecutorService 執(zhí)行方法的默認(rèn)實(shí)現(xiàn)。
  • Executors:實(shí)現(xiàn)ExecutorService接口的靜態(tài)工廠類,提供了一系列工廠方法用于創(chuàng)建線程池。
  • ThreadPoolExecutor:繼承AbstractExecutorService,用于創(chuàng)建線程池。
  • ForkJoinPool: 繼承AbstractExecutorService,F(xiàn)ork 將大任務(wù)分叉為多個(gè)小任務(wù),然后讓小任務(wù)執(zhí)行,Join 是獲得小任務(wù)的結(jié)果,類似于map reduce。
  • ThreadPoolExecutor:繼承ThreadPoolExecutor,實(shí)現(xiàn)ScheduledExecutorService,用于創(chuàng)建帶定時(shí)任務(wù)的線程池。

簡(jiǎn)述線程池的狀態(tài)

  • Running:能接受新提交的任務(wù),也可以處理阻塞隊(duì)列的任務(wù)。
  • Shutdown:不再接受新提交的任務(wù),但可以處理存量任務(wù),線程池處于running時(shí)調(diào)用shutdown方法,會(huì)進(jìn)入該狀態(tài)。
  • Stop:不接受新任務(wù),不處理存量任務(wù),調(diào)用shutdownnow進(jìn)入該狀態(tài)。
  • Tidying:所有任務(wù)已經(jīng)終止了,worker_count(有效線程數(shù))為0。
  • Terminated:線程池徹底終止。在tidying模式下調(diào)用terminated方法會(huì)進(jìn)入該狀態(tài)。

簡(jiǎn)述阻塞隊(duì)列

阻塞隊(duì)列是生產(chǎn)者消費(fèi)者的實(shí)現(xiàn)具體組件之一。當(dāng)阻塞隊(duì)列為空時(shí),從隊(duì)列中獲取元素的操作將會(huì)被阻塞,當(dāng)阻塞隊(duì)列滿了,往隊(duì)列添加元素的操作將會(huì)被阻塞。具體實(shí)現(xiàn)有:

  • ArrayBlockingQueue:底層是由數(shù)組組成的有界阻塞隊(duì)列。
  • LinkedBlockingQueue:底層是由鏈表組成的有界阻塞隊(duì)列。
  • PriorityBlockingQueue:阻塞優(yōu)先隊(duì)列。
  • DelayQueue:創(chuàng)建元素時(shí)可以指定多久才能從隊(duì)列中獲取當(dāng)前元素
  • SynchronousQueue:不存儲(chǔ)元素的阻塞隊(duì)列,每一個(gè)存儲(chǔ)必須等待一個(gè)取出操作
  • LinkedTransferQueue:與LinkedBlockingQueue相比多一個(gè)transfer方法,即如果當(dāng)前有消費(fèi)者正等待接收元素,可以把生產(chǎn)者傳入的元素立刻傳輸給消費(fèi)者。
  • LinkedBlockingDeque:雙向阻塞隊(duì)列。

談一談ThreadLocal

ThreadLocal 是線程共享變量。ThreadLoacl 有一個(gè)靜態(tài)內(nèi)部類 ThreadLocalMap,其 Key 是 ThreadLocal 對(duì)象,值是 Entry 對(duì)象,ThreadLocalMap是每個(gè)線程私有的。

  • set 給ThreadLocalMap設(shè)置值。
  • get 獲取ThreadLocalMap。
  • remove 刪除ThreadLocalMap類型的對(duì)象。

存在的問題

  1. 對(duì)于線程池,由于線程池會(huì)重用 Thread 對(duì)象,因此與 Thread 綁定的 ThreadLocal 也會(huì)被重用,造成一系列問題。
  2. 內(nèi)存泄漏。由于 ThreadLocal 是弱引用,但 Entry 的 value 是強(qiáng)引用,因此當(dāng) ThreadLocal 被垃圾回收后,value 依舊不會(huì)被釋放,產(chǎn)生內(nèi)存泄漏。

聊聊你對(duì)java并發(fā)包下unsafe類的理解

對(duì)于 Java 語(yǔ)言,沒有直接的指針組件,一般也不能使用偏移量對(duì)某塊內(nèi)存進(jìn)行操作。這些操作相對(duì)來(lái)講是安全(safe)的。

Java 有個(gè)類叫 Unsafe 類,這個(gè)類類使 Java 擁有了像 C 語(yǔ)言的指針一樣操作內(nèi)存空間的能力,同時(shí)也帶來(lái)了指針的問題。這個(gè)類可以說是 Java 并發(fā)開發(fā)的基礎(chǔ)。

JAVA中的樂觀鎖與CAS算法

對(duì)于樂觀鎖,開發(fā)者認(rèn)為數(shù)據(jù)發(fā)送時(shí)發(fā)生并發(fā)沖突的概率不大,所以讀操作前不上鎖。

到了寫操作時(shí)才會(huì)進(jìn)行判斷,數(shù)據(jù)在此期間是否被其他線程修改。如果發(fā)生修改,那就返回寫入失敗;如果沒有被修改,那就執(zhí)行修改操作,返回修改成功。

樂觀鎖一般都采用 Compare And Swap(CAS)算法進(jìn)行實(shí)現(xiàn)。顧名思義,該算法涉及到了兩個(gè)操作,比較(Compare)和交換(Swap)。

CAS 算法的思路如下:

  1. 該算法認(rèn)為不同線程對(duì)變量的操作時(shí)產(chǎn)生競(jìng)爭(zhēng)的情況比較少。
  2. 該算法的核心是對(duì)當(dāng)前讀取變量值 E 和內(nèi)存中的變量舊值 V 進(jìn)行比較。
  3. 如果相等,就代表其他線程沒有對(duì)該變量進(jìn)行修改,就將變量值更新為新值 N。
  4. 如果不等,就認(rèn)為在讀取值 E 到比較階段,有其他線程對(duì)變量進(jìn)行過修改,不進(jìn)行任何操作。

ABA問題及解決方法簡(jiǎn)述

CAS 算法是基于值來(lái)做比較的,如果當(dāng)前有兩個(gè)線程,一個(gè)線程將變量值從 A 改為 B ,再由 B 改回為 A ,當(dāng)前線程開始執(zhí)行 CAS 算法時(shí),就很容易認(rèn)為值沒有變化,誤認(rèn)為讀取數(shù)據(jù)到執(zhí)行 CAS 算法的期間,沒有線程修改過數(shù)據(jù)。

juc 包提供了一個(gè) AtomicStampedReference,即在原始的版本下加入版本號(hào)戳,解決 ABA 問題。

簡(jiǎn)述常見的Atomic類

在很多時(shí)候,我們需要的僅僅是一個(gè)簡(jiǎn)單的、高效的、線程安全的++或者--方案,使用synchronized關(guān)鍵字和lock固然可以實(shí)現(xiàn),但代價(jià)比較大,此時(shí)用原子類更加方便。基本數(shù)據(jù)類型的原子類有:

  • AtomicInteger 原子更新整形
  • AtomicLong 原子更新長(zhǎng)整型
  • AtomicBoolean 原子更新布爾類型

Atomic數(shù)組類型有:

  • AtomicIntegerArray 原子更新整形數(shù)組里的元素
  • AtomicLongArray 原子更新長(zhǎng)整型數(shù)組里的元素
  • AtomicReferenceArray 原子更新引用類型數(shù)組里的元素。

Atomic引用類型有

  • AtomicReference 原子更新引用類型
  • AtomicMarkableReference 原子更新帶有標(biāo)記位的引用類型,可以綁定一個(gè) boolean 標(biāo)記
  • AtomicStampedReference 原子更新帶有版本號(hào)的引用類型

FieldUpdater類型:

  • AtomicIntegerFieldUpdater 原子更新整形字段的更新器
  • AtomicLongFieldUpdater 原子更新長(zhǎng)整形字段的更新器
  • AtomicReferenceFieldUpdater 原子更新引用類型字段的更新器

簡(jiǎn)述Atomic類基本實(shí)現(xiàn)原理

以AtomicIntger 為例:方法getAndIncrement:以原子方式將當(dāng)前的值加1,具體實(shí)現(xiàn)為:

  1. 在 for 死循環(huán)中取得 AtomicInteger 里存儲(chǔ)的數(shù)值
  2. 對(duì) AtomicInteger 當(dāng)前的值加 1
  3. 調(diào)用 compareAndSet 方法進(jìn)行原子更新
  4. 先檢查當(dāng)前數(shù)值是否等于 expect
  5. 如果等于則說明當(dāng)前值沒有被其他線程修改,則將值更新為 next,
  6. 如果不是會(huì)更新失敗返回 false,程序會(huì)進(jìn)入 for 循環(huán)重新進(jìn)行 compareAndSet 操作。

簡(jiǎn)述CountDownLatch

countDownLatch這個(gè)類使一個(gè)線程等待其他線程各自執(zhí)行完畢后再執(zhí)行。是通過一個(gè)計(jì)數(shù)器來(lái)實(shí)現(xiàn)的,計(jì)數(shù)器的初始值是線程的數(shù)量。每當(dāng)一個(gè)線程執(zhí)行完畢后,調(diào)用countDown方法,計(jì)數(shù)器的值就減1,當(dāng)計(jì)數(shù)器的值為0時(shí),表示所有線程都執(zhí)行完畢,然后在等待的線程就可以恢復(fù)工作了。只能一次性使用,不能reset。

簡(jiǎn)述CyclicBarrier

CyclicBarrier 主要功能和countDownLatch類似,也是通過一個(gè)計(jì)數(shù)器,使一個(gè)線程等待其他線程各自執(zhí)行完畢后再執(zhí)行。但是其可以重復(fù)使用(reset)。

簡(jiǎn)述Semaphore

Semaphore即信號(hào)量。Semaphore 的構(gòu)造方法參數(shù)接收一個(gè) int 值,設(shè)置一個(gè)計(jì)數(shù)器,表示可用的許可數(shù)量即最大并發(fā)數(shù)。使用 acquire 方法獲得一個(gè)許可證,計(jì)數(shù)器減一,使用 release 方法歸還許可,計(jì)數(shù)器加一。如果此時(shí)計(jì)數(shù)器值為0,線程進(jìn)入休眠。

簡(jiǎn)述Exchanger

Exchanger類可用于兩個(gè)線程之間交換信息。可簡(jiǎn)單地將Exchanger對(duì)象理解為一個(gè)包含兩個(gè)格子的容器,通過exchanger方法可以向兩個(gè)格子中填充信息。線程通過exchange 方法交換數(shù)據(jù),第一個(gè)線程執(zhí)行 exchange 方法后會(huì)阻塞等待第二個(gè)線程執(zhí)行該方法。當(dāng)兩個(gè)線程都到達(dá)同步點(diǎn)時(shí)這兩個(gè)線程就可以交換數(shù)據(jù)當(dāng)兩個(gè)格子中的均被填充時(shí),該對(duì)象會(huì)自動(dòng)將兩個(gè)格子的信息交換,然后返回給線程,從而實(shí)現(xiàn)兩個(gè)線程的信息交換。

簡(jiǎn)述ConcurrentHashMap

JDK7采用鎖分段技術(shù)。首先將數(shù)據(jù)分成 Segment 數(shù)據(jù)段,然后給每一個(gè)數(shù)據(jù)段配一把鎖,當(dāng)一個(gè)線程占用鎖訪問其中一個(gè)段的數(shù)據(jù)時(shí),其他段的數(shù)據(jù)也能被其他線程訪問。

get 除讀到空值不需要加鎖。該方法先經(jīng)過一次再散列,再用這個(gè)散列值通過散列運(yùn)算定位到 Segment,最后通過散列算法定位到元素。put 須加鎖,首先定位到 Segment,然后進(jìn)行插入操作,第一步判斷是否需要對(duì) Segment 里的 HashEntry 數(shù)組進(jìn)行擴(kuò)容,第二步定位添加元素的位置,然后將其放入數(shù)組。

JDK8的改進(jìn)

  1. 取消分段鎖機(jī)制,采用CAS算法進(jìn)行值的設(shè)置,如果CAS失敗再使用 synchronized 加鎖添加元素
  2. 引入紅黑樹結(jié)構(gòu),當(dāng)某個(gè)槽內(nèi)的元素個(gè)數(shù)超過8且 Node數(shù)組 容量大于 64 時(shí),鏈表轉(zhuǎn)為紅黑樹。
  3. 使用了更加優(yōu)化的方式統(tǒng)計(jì)集合內(nèi)的元素?cái)?shù)量。

Synchronized底層實(shí)現(xiàn)原理

Java 對(duì)象底層都關(guān)聯(lián)一個(gè)的 monitor,使用 synchronized 時(shí) JVM 會(huì)根據(jù)使用環(huán)境找到對(duì)象的 monitor,根據(jù) monitor 的狀態(tài)進(jìn)行加解鎖的判斷。如果成功加鎖就成為該 monitor 的唯一持有者,monitor 在被釋放前不能再被其他線程獲取。

synchronized在JVM編譯后會(huì)產(chǎn)生monitorenter 和 monitorexit 這兩個(gè)字節(jié)碼指令,獲取和釋放 monitor。這兩個(gè)字節(jié)碼指令都需要一個(gè)引用類型的參數(shù)指明要鎖定和解鎖的對(duì)象,對(duì)于同步普通方法,鎖是當(dāng)前實(shí)例對(duì)象;對(duì)于靜態(tài)同步方法,鎖是當(dāng)前類的 Class 對(duì)象;對(duì)于同步方法塊,鎖是 synchronized 括號(hào)里的對(duì)象。

執(zhí)行 monitorenter 指令時(shí),首先嘗試獲取對(duì)象鎖。如果這個(gè)對(duì)象沒有被鎖定,或當(dāng)前線程已經(jīng)持有鎖,就把鎖的計(jì)數(shù)器加 1,執(zhí)行 monitorexit 指令時(shí)會(huì)將鎖計(jì)數(shù)器減 1。一旦計(jì)數(shù)器為 0 鎖隨即就被釋放。

Synchronized關(guān)鍵詞使用方法

  1. 直接修飾某個(gè)實(shí)例方法
  2. 直接修飾某個(gè)靜態(tài)方法
  3. 修飾代碼塊

簡(jiǎn)述java偏向鎖

JDK 1.6 中提出了偏向鎖的概念。該鎖提出的原因是,開發(fā)者發(fā)現(xiàn)多數(shù)情況下鎖并不存在競(jìng)爭(zhēng),一把鎖往往是由同一個(gè)線程獲得的。偏向鎖并不會(huì)主動(dòng)釋放,這樣每次偏向鎖進(jìn)入的時(shí)候都會(huì)判斷該資源是否是偏向自己的,如果是偏向自己的則不需要進(jìn)行額外的操作,直接可以進(jìn)入同步操作。

其申請(qǐng)流程為:

  1. 首先需要判斷對(duì)象的 Mark Word 是否屬于偏向模式,如果不屬于,那就進(jìn)入輕量級(jí)鎖判斷邏輯。否則繼續(xù)下一步判斷;
  2. 判斷目前請(qǐng)求鎖的線程 ID 是否和偏向鎖本身記錄的線程 ID 一致。如果一致,繼續(xù)下一步的判斷,如果不一致,跳轉(zhuǎn)到步驟4;
  3. 判斷是否需要重偏向。如果不用的話,直接獲得偏向鎖;
  4. 利用 CAS 算法將對(duì)象的 Mark Word 進(jìn)行更改,使線程 ID 部分換成本線程 ID。如果更換成功,則重偏向完成,獲得偏向鎖。如果失敗,則說明有多線程競(jìng)爭(zhēng),升級(jí)為輕量級(jí)鎖。

簡(jiǎn)述輕量級(jí)鎖

輕量級(jí)鎖是為了在沒有競(jìng)爭(zhēng)的前提下減少重量級(jí)鎖出現(xiàn)并導(dǎo)致的性能消耗。

其申請(qǐng)流程為:

  1. 如果同步對(duì)象沒有被鎖定,虛擬機(jī)將在當(dāng)前線程的棧幀中建立一個(gè)鎖記錄空間,存儲(chǔ)鎖對(duì)象目前 Mark Word 的拷貝。
  2. 虛擬機(jī)使用 CAS 嘗試把對(duì)象的 Mark Word 更新為指向鎖記錄的指針
  3. 如果更新成功即代表該線程擁有了鎖,鎖標(biāo)志位將轉(zhuǎn)變?yōu)?00,表示處于輕量級(jí)鎖定狀態(tài)。
  4. 如果更新失敗就意味著至少存在一條線程與當(dāng)前線程競(jìng)爭(zhēng)。虛擬機(jī)檢查對(duì)象的 Mark Word 是否指向當(dāng)前線程的棧幀
  5. 如果指向當(dāng)前線程的棧幀,說明當(dāng)前線程已經(jīng)擁有了鎖,直接進(jìn)入同步塊繼續(xù)執(zhí)行
  6. 如果不是則說明鎖對(duì)象已經(jīng)被其他線程搶占。
  7. 如果出現(xiàn)兩條以上線程爭(zhēng)用同一個(gè)鎖,輕量級(jí)鎖就不再有效,將膨脹為重量級(jí)鎖,鎖標(biāo)志狀態(tài)變?yōu)?10,此時(shí)Mark Word 存儲(chǔ)的就是指向重量級(jí)鎖的指針,后面等待鎖的線程也必須阻塞。

簡(jiǎn)述鎖優(yōu)化策略

即自適應(yīng)自旋、鎖消除、鎖粗化、鎖升級(jí)等策略偏。

簡(jiǎn)述java的自旋鎖

線程獲取鎖失敗后,可以采用這樣的策略,可以不放棄 CPU ,不停的重試內(nèi)重試,這種操作也稱為自旋鎖。

簡(jiǎn)述自適應(yīng)自旋鎖

自適應(yīng)自旋鎖自旋次數(shù)不再人為設(shè)定,通常由前一次在同一個(gè)鎖上的自旋時(shí)間及鎖的擁有者的狀態(tài)決定。

簡(jiǎn)述鎖粗化

鎖粗化的思想就是擴(kuò)大加鎖范圍,避免反復(fù)的加鎖和解鎖。

簡(jiǎn)述鎖消除

鎖消除是一種更為徹底的優(yōu)化,在編譯時(shí),java編譯器對(duì)運(yùn)行上下文進(jìn)行掃描,去除不可能存在共享資源競(jìng)爭(zhēng)的鎖。

簡(jiǎn)述Lock與ReentrantLock

Lock 接是 java并發(fā)包的頂層接口。

可重入鎖 ReentrantLock 是 Lock 最常見的實(shí)現(xiàn),與 synchronized 一樣可重入。ReentrantLock 在默認(rèn)情況下是非公平的,可以通過構(gòu)造方法指定公平鎖。一旦使用了公平鎖,性能會(huì)下降。

簡(jiǎn)述AQS

AQS(AbstractQuenedSynchronizer)抽象的隊(duì)列式同步器。AQS是將每一條請(qǐng)求共享資源的線程封裝成一個(gè)鎖隊(duì)列的一個(gè)結(jié)點(diǎn)(Node),來(lái)實(shí)現(xiàn)鎖的分配。AQS是用來(lái)構(gòu)建鎖或其他同步組件的基礎(chǔ)框架,它使用一個(gè) volatile int state 變量作為共享資源,如果線程獲取資源失敗,則進(jìn)入同步隊(duì)列等待;如果獲取成功就執(zhí)行臨界區(qū)代碼,釋放資源時(shí)會(huì)通知同步隊(duì)列中的等待線程。

子類通過繼承同步器并實(shí)現(xiàn)它的抽象方法getState、setState 和 compareAndSetState對(duì)同步狀態(tài)進(jìn)行更改。

AQS獲取獨(dú)占鎖/釋放獨(dú)占鎖原理

獲取:(acquire)

  1. 調(diào)用 tryAcquire 方法安全地獲取線程同步狀態(tài),獲取失敗的線程會(huì)被構(gòu)造同步節(jié)點(diǎn)并通過 addWaiter 方法加入到同步隊(duì)列的尾部,在隊(duì)列中自旋。
  2. 調(diào)用 acquireQueued 方法使得該節(jié)點(diǎn)以死循環(huán)的方式獲取同步狀態(tài),如果獲取不到則阻塞。

釋放:(release)

  1. 調(diào)用 tryRelease 方法釋放同步狀態(tài)
  2. 調(diào)用 unparkSuccessor 方法喚醒頭節(jié)點(diǎn)的后繼節(jié)點(diǎn),使后繼節(jié)點(diǎn)重新嘗試獲取同步狀態(tài)。

AQS獲取共享鎖/釋放共享鎖原理

獲取鎖(acquireShared)

調(diào)用 tryAcquireShared 方法嘗試獲取同步狀態(tài),返回值不小于 0 表示能獲取同步狀態(tài)。

釋放(releaseShared)

釋放,并喚醒后續(xù)處于等待狀態(tài)的節(jié)點(diǎn)。

線程池類型

  1. newCachedThreadPool 可緩存線程池,可設(shè)置最小線程數(shù)和最大線程數(shù),線程空閑1分鐘后自動(dòng)銷毀。
  2. newFixedThreadPool 指定工作線程數(shù)量線程池。
  3. newSingleThreadExecutor 單線程Executor。
  4. newScheduleThreadPool 支持定時(shí)任務(wù)的指定工作線程數(shù)量線程池。
  5. newSingleThreadScheduledExecutor 支持定時(shí)任務(wù)的單線程Executor。

 

責(zé)任編輯:武曉燕 來(lái)源: 后端技術(shù)小牛說
相關(guān)推薦

2021-04-14 10:02:59

網(wǎng)絡(luò)八股文協(xié)議

2021-05-20 11:43:57

操作系統(tǒng)硬件軟件

2021-10-21 14:43:23

Java 語(yǔ)言 Java 基礎(chǔ)

2021-10-26 14:40:03

MySQL SQL 語(yǔ)句數(shù)據(jù)庫(kù)

2021-11-04 14:32:17

Spring 面試作用域

2025-10-15 03:00:00

2023-11-28 18:09:49

Java多態(tài)

2021-09-07 14:46:42

面試網(wǎng)絡(luò)HTTP 協(xié)議

2021-07-26 14:59:23

面試Redis內(nèi)存數(shù)據(jù)庫(kù)

2021-10-26 17:05:55

Redis字符串復(fù)雜度

2022-09-03 11:36:11

Python文件網(wǎng)絡(luò)

2024-10-12 09:26:32

線程池系統(tǒng)核心線程

2021-08-01 22:59:43

Object八股文quals

2024-02-23 19:17:12

構(gòu)造函數(shù)C++開發(fā)

2025-08-07 09:17:37

2022-01-04 08:54:32

Redis數(shù)據(jù)庫(kù)數(shù)據(jù)類型

2021-05-06 07:27:57

面試任務(wù)調(diào)度器

2023-12-12 13:38:00

Java異步編程

2023-11-29 17:28:07

2022-05-27 14:43:45

JVM字節(jié)碼指令
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩在线免费高清视频| 亚洲综合在线五月| 国产精品亚洲美女av网站| 91网站免费入口| 涩涩涩久久久成人精品| 中文字幕在线观看不卡视频| 亚洲va久久久噜噜噜久久天堂| jizz18女人高潮| 亚洲欧美一级| 亚洲高清免费观看| 日韩中文字幕av在线| 97国产精品久久久| 在线欧美福利| 原创国产精品91| 久久久久久无码精品人妻一区二区| 91网页在线观看| 国产经典欧美精品| 欧洲精品久久久| 久久精品日韩无码| 日韩三级电影网| 亚洲午夜伦理| 亚洲天堂开心观看| 国产探花在线观看视频| 美女高潮视频在线看| 日本一级理论片在线大全| 日本欧美国产| 精品国产免费人成在线观看| 性欧美极品xxxx欧美一区二区| 欧美性天天影视| 本田岬高潮一区二区三区| 国产成人精品午夜| 久久久99精品| 色琪琪久久se色| 日韩高清不卡av| 国产人妻精品久久久久野外| 国产h片在线观看| 最新高清无码专区| 欧美日韩一区综合| а√中文在线资源库| 视频一区在线视频| 97久久精品在线| 色婷婷**av毛片一区| 91精品国产自产在线| 亚洲黄色小说图片| 欧美国产三级| 在线精品高清中文字幕| 国产麻豆剧传媒精品国产av| 爱情电影网av一区二区| 在线观看免费成人| 黄色免费视频大全| 91福利区在线观看| 一区二区三区四区五区视频在线观看 | 日本成人动漫在线观看| 久久99精品国产麻豆婷婷| 7m精品福利视频导航| 久久久久久久久99| 99视频精品全部免费在线视频| 亚洲欧美综合v| 中文乱码人妻一区二区三区视频| 一区二区三区视频免费视频观看网站 | 久久亚洲高清| 天堂资源在线亚洲资源| 欧美成人一区二区视频| 国产农村妇女毛片精品久久莱园子| 欧美日韩国产成人在线| 91人妻一区二区三区蜜臀| 日韩高清欧美| 色婷婷综合久久久久| 一级二级黄色片| 精品国产精品国产偷麻豆| 亚洲欧美自拍一区| 谁有免费的黄色网址| 国产一区二区三区四区| 亚洲性生活视频| 伊人网伊人影院| eeuss鲁片一区二区三区| 欧美一级国产精品| 国产探花在线观看视频| 人妻体体内射精一区二区| 国产精品蜜芽在线观看| 欧美日韩国产丝袜美女| 女人和拘做爰正片视频| 小草在线视频免费播放| 黑人巨大精品欧美一区二区一视频 | 日本丰满少妇做爰爽爽| 日本va欧美va精品| 国产日韩精品入口| 99国产在线播放| 国产成人精品亚洲日本在线桃色| 成人资源视频网站免费| 奇米视频7777| mm视频在线视频| 亚洲.国产.中文慕字在线| 欧美,日韩,国产在线| 成人美女视频| 欧美日韩在线不卡| 五月天国产视频| 国产精品一线| 国产一区二区三区在线观看视频 | 一区二区国产欧美| 国产一区二区伦理片| 国产伦精品一区二区三毛| 亚洲欧美综合在线观看| 视频福利一区| www.av亚洲| 久久国产精品久久| aaa日本高清在线播放免费观看| 亚洲欧美综合另类在线卡通| 日本男女交配视频| 日韩在线伦理| 欧美久久久久久久久| 国产人妖在线观看| 国产一区二区亚洲| 欧美国产日韩一区二区三区| 日本特黄特色aaa大片免费| 久久久久99| 2022国产精品| 噜噜噜噜噜在线视频| 日韩毛片精品高清免费| 老太脱裤子让老头玩xxxxx| 亚洲www啪成人一区二区| 九色成人搞黄网站| 色www精品视频在线观看| 亚洲第一成肉网| 日本妇女一区| 美女少妇精品视频| 99久久久久久久久| 国产丶欧美丶日本不卡视频| 日韩精品国内| 亚洲制服国产| 欧美日韩综合不卡| www.日本高清| 欧美三区不卡| 成人美女免费网站视频| 久久这里精品| 亚洲国产另类av| 91 视频免费观看| 精品freesex老太交| 久久久最新网址| 好吊色欧美一区二区三区四区| 黄频网站在线观看| 中文字幕五月欧美| 国产精品人人妻人人爽人人牛| 试看120秒一区二区三区| 国产一区二区三区在线| 国产又大又黄又粗| www.66久久| 欧美这里只有精品| 国产精久久一区二区| 中文字幕不卡在线视频极品| 伊人久久综合视频| 国产麻豆视频一区二区| 亚洲一区bb| 黄色精品视频| 亚洲男人天堂网| 日本视频在线观看免费| 国产精品77777| 中文字幕亚洲一区二区三区五十路| 极品美女扒开粉嫩小泬| 精品一区二区三区中文字幕在线| 最近2019年好看中文字幕视频| 在线免费观看国产精品| 久久久另类综合| 凹凸日日摸日日碰夜夜爽1| 日韩美女毛片| 91爱视频在线| 欧洲视频在线免费观看| 欧美日韩久久久久| aaaaa级少妇高潮大片免费看| 亚洲免费观看| 精品视频在线观看| 免费v片在线观看| 日韩理论片久久| 日本熟女毛茸茸| 国产偷国产偷亚洲高清人白洁| 任你操这里只有精品| 黄网站在线免费| 久久亚洲精品伦理| 成人影片在线播放| 美女露胸视频在线观看| 亚洲欧美日韩网| 国产精品午夜一区二区| 国产精品久久久久久久久久久免费看| 天堂一区在线观看| 亚洲男女av一区二区| 亚洲一区二区三区sesese| 日本在线免费| 精品国产乱码久久久久久图片| 日韩欧美激情视频| 久久色在线视频| 午夜宅男在线视频| 欧美日本不卡| 免费看成人午夜电影| 欧美性片在线观看| 久久久国产成人精品| 黄色一级大片在线免费看国产一 | 中文字幕日韩三级| 中文字幕av不卡| 在线观看网站黄| 亚洲综合社区| 欧美日韩精品久久| 999精品嫩草久久久久久99| 久久国产精品亚洲| 天堂中文在线资| 欧美日韩视频一区二区| 黄色一级片在线| 久久日韩精品一区二区五区| 亚洲精品性视频| 欧美1区2区| 欧美激情导航| 久久免费精品| 国产精品久久二区| 波多野结衣办公室双飞| jizz一区二区三区| 精品爽片免费看久久| 国产乱淫av片免费| 欧美午夜精品久久久久久浪潮| 激情高潮到大叫狂喷水| 国模无码大尺度一区二区三区| 亚洲熟妇无码一区二区三区导航| 精品一区二区三区中文字幕老牛| 国产综合在线观看视频| 中文字幕高清在线播放| 中文字幕在线精品| 无码精品人妻一区二区三区影院| 欧美日韩免费在线视频| 国产欧美日韩另类| 亚洲色图欧美激情| 高清国产在线观看| 91在线丨porny丨国产| 亚洲精品在线视频播放| 久久一区二区三区超碰国产精品| 日韩免费av片在线观看| 精品无码久久久久久久| 久久久亚洲综合| 国产艳妇疯狂做爰视频| 韩国女主播成人在线观看| 情侣黄网站免费看| 亚洲一级一区| 国产精品久久成人免费观看| 网友自拍一区| 国产精品欧美久久| 国产精久久久| 国产综合色香蕉精品| 国产精品毛片久久久久久久久久99999999| 午夜精品福利电影| 看黄网站在线观看| 俺也去精品视频在线观看| 福利视频在线导航| 亚洲毛片在线看| 香蕉国产在线视频| 亚洲国产精品久久精品怡红院| 国产999久久久| 91精品国产91热久久久做人人| 蜜桃网站在线观看| 精品亚洲自拍| 91九色露脸| 久久99国产精品久久99大师| 精品欧美日韩| 精品福利久久久| 超碰免费在线公开| 韩日欧美一区| 2022亚洲天堂| 蜜臀99久久精品久久久久久软件| 亚洲va综合va国产va中文| 国产剧情一区二区| 四虎精品一区二区| 久久女同精品一区二区| 综合 欧美 亚洲日本| 亚洲美腿欧美偷拍| 日本一区二区三区免费视频| 色一区在线观看| 亚洲天堂中文在线| 欧美不卡一区二区| 久蕉在线视频| 欧美成人性色生活仑片| 国产免费拔擦拔擦8x在线播放 | 国产精品一二三四| 日韩少妇一区二区| 久久久久久亚洲综合| 久久精品色妇熟妇丰满人妻| 亚洲麻豆国产自偷在线| 久久草视频在线| 欧美日韩国产一级| 姝姝窝人体www聚色窝| 亚洲人成免费电影| 99视频免费在线观看| 欧美一级片免费在线| 国产成人免费av一区二区午夜| 精品国产一区二区三区久久久久久| 国产91精品对白在线播放| 日韩第一页在线观看| 先锋影音久久| 亚洲视频在线不卡| 国产日韩欧美综合一区| 久久国产精品波多野结衣av| 在线视频一区二区三| 曰本三级日本三级日本三级| 加勒比色综合久久久久久久久| 亚洲一区二区三区成人在线视频精品| 日韩极品少妇| 午夜在线视频免费观看| 久久久久久久欧美精品| 无码人妻少妇色欲av一区二区| 91啦中文在线观看| 九九免费精品视频| 欧美三日本三级三级在线播放| 无码精品视频一区二区三区| 久久精品国产69国产精品亚洲| 波多视频一区| 国产欧美日韩一区二区三区| 999久久久91| 熟妇人妻va精品中文字幕| 从欧美一区二区三区| 午夜国产福利视频| 日本高清不卡视频| 天堂在线观看av| 欧美成人免费在线观看| 九七电影院97理论片久久tvb| 久久精品国产一区二区三区日韩 | 午夜剧场成人观在线视频免费观看| 97人人做人人爽香蕉精品| 国产欧美日韩综合一区在线观看| 天天综合国产| 国模私拍视频在线观看| 久久久电影一区二区三区| 日韩精品视频免费看| 日韩午夜激情视频| 国产在线看片| 成人福利网站在线观看11| 欧美一级精品| 超碰97人人射妻| 91色乱码一区二区三区| 日韩精品视频免费看| 精品欧美乱码久久久久久1区2区| 91三级在线| 亚洲xxx视频| 综合天堂av久久久久久久| 国产精品嫩草影院8vv8 | 国产视频久久久久| 中文字幕日韩免费| 美女一区二区三区| 最新中文字幕日本| 一区二区在线观看av| 99久久国产热无码精品免费| 久久最新资源网| 久久综合给合| 国产在线xxxx| 成人动漫在线一区| 日韩污视频在线观看| 日韩精品视频三区| 澳门成人av网| 特级西西444www大精品视频| 日韩精品一区第一页| 亚洲色图 激情小说| 在线播放一区二区三区| av网站在线看| 国产精品制服诱惑| 国产日韩综合| 中国特黄一级片| 日韩一区二区在线观看视频播放| 日本高清在线观看视频| 国产一区二区三区免费不卡| 亚洲永久免费| 亚洲精品国产精品国自| 9191久久久久久久久久久| 调教一区二区| 精品日韩欧美| 亚洲图片小说视频| 日韩精品在线免费播放| 欧美黄色三级| 特级黄色录像片| www.亚洲色图.com| 无码人妻丰满熟妇区五十路| 深夜福利亚洲导航| 精品国产乱码一区二区三区| 欧美亚洲色图视频| 26uuuu精品一区二区| 中文字幕一区二区三区人妻四季| 久久综合五月天| 全国精品免费看| 欧美日韩精品区别| 亚洲福利视频导航| 成人精品福利| 99理论电影网| 丝袜美腿高跟呻吟高潮一区| 日本一级片免费| 亚洲免费人成在线视频观看| 日韩综合av| 97国产精东麻豆人妻电影| 国产精品成人免费精品自在线观看| 亚洲成人77777| 国产精品a久久久久久| 欧美成人久久| 欧美老女人性生活视频| 精品国产麻豆免费人成网站| 亚洲黄色三级视频| 中文字幕免费一区| 中文字幕一级片| 91国语精品自产拍在线观看性色 |