溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

大數(shù)據(jù)線程高級(jí)部分內(nèi)容有哪些

發(fā)布時(shí)間:2021-12-22 15:30:52 來源:億速云 閱讀:151 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“大數(shù)據(jù)線程高級(jí)部分內(nèi)容有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

首先講一下線程的生命周期

> 對(duì)于一個(gè)線程, 在被創(chuàng)建后, 不是立即就進(jìn)入到了運(yùn)行狀態(tài), 也不是一直處于運(yùn)行狀態(tài), 在線程的聲明周期中, 一個(gè)線程會(huì)在多種狀態(tài)之間進(jìn)行切換

>

>  

>

> new : 新生狀態(tài), 線程被實(shí)例化, 但是還沒有開始執(zhí)行(start)

>

> runnable: 就緒狀態(tài), 已經(jīng)執(zhí)行過start, 線程已經(jīng)啟動(dòng)了, 只是沒有搶到CPU時(shí)間片

>

> running: 運(yùn)行狀態(tài), 搶到了CPU時(shí)間片

>

> blocked: 阻塞狀態(tài), 線程執(zhí)行的過程中, 遇到一些特殊情況, 會(huì)進(jìn)入阻塞狀態(tài). 阻塞中的線程, 是不能參數(shù)時(shí)間片的搶奪的 (不能被線程調(diào)度器調(diào)度)

>

> dead: 死亡狀態(tài), 線程終止

>

>  正常死亡 : run方法中的代碼執(zhí)行結(jié)束

>

>  非正常死亡 : 強(qiáng)制使用stop方法停止這個(gè)線程

#### 臨界資源問題

> 由于線程之間是資源共享的。如果有多個(gè)線程,同時(shí)對(duì)一個(gè)數(shù)據(jù)進(jìn)行操作,此時(shí)這個(gè)數(shù)據(jù)會(huì)出現(xiàn)問題。

> 如果有一個(gè)線程在訪問一個(gè)臨界資源,在訪問之前,先對(duì)這個(gè)資源“上鎖”,此時(shí)如果有其他的線程也需要訪問這個(gè)臨界資源,需要先查這個(gè)資源有沒有被上鎖,如果沒有被上鎖,此時(shí)這個(gè)線程可以訪問這個(gè)資源;如果上鎖了,則此時(shí)這個(gè)線程進(jìn)入阻塞狀態(tài),等待解鎖。

####同步代碼段

> ```java

> // 同步代碼段

> // 小括號(hào):就是鎖

> // 大括號(hào):同步代碼段,一般情況下,寫需要對(duì)臨界資源進(jìn)行的操作

> synchronized () {

>   

> }

> // 關(guān)于同步鎖:可以分成兩種:對(duì)象鎖、類鎖

> //

> ```

>

####同步方法

> ```java

> // 使用synchronized關(guān)鍵字修飾的方法就是同步方法

> // 將一個(gè)方法中所有的代碼進(jìn)行一個(gè)同步

> // 相當(dāng)于將一個(gè)方法中所有的代碼都放到一個(gè)synchronized代碼段中

> // 同步方法的鎖:

> // 1. 如果這個(gè)方法是一個(gè)非靜態(tài)方法:鎖是this

> // 2. 如果這個(gè)方法是一個(gè)靜態(tài)方法:鎖是類鎖(當(dāng)前類.class)

> private synchronized void sellTicket() {

> }

> ```

>

#### lock與unlock

> 就是一個(gè)類RenntrantLock

#### 線程死鎖(了解)

在解決臨界資源問題的時(shí)候,我們引入了一個(gè)"鎖"的概念。我們可以用鎖對(duì)一個(gè)資源進(jìn)行保護(hù)。實(shí)際,在多線程的環(huán)境下,有可能會(huì)出現(xiàn)一種情況:

> 假設(shè)有A和B兩個(gè)線程,其中線程A持有鎖標(biāo)記a,線程B持有鎖標(biāo)記b,而此時(shí),線程A等待鎖標(biāo)記b的釋放,線程B等待鎖標(biāo)記a的釋放。這種情況,叫做  **死鎖**

#### 生產(chǎn)者消費(fèi)者設(shè)計(jì)模式

> wait() 、notify() 、notifyAll()

>

> wait(): 等待。使得當(dāng)前的線程釋放鎖標(biāo)記,進(jìn)入等待隊(duì)列??梢允巩?dāng)前的線程進(jìn)入阻塞狀態(tài)。

>

> notify(): 喚醒,喚醒等待隊(duì)列中的一個(gè)線程。

>

> notifyAll(): 喚醒,喚醒等待隊(duì)列中所有的線程。

> wait和sleep的區(qū)別:

>

> 1. 兩個(gè)方法都可以使一個(gè)線程進(jìn)入阻塞。

> 2. 區(qū)別:wait方法會(huì)釋放鎖標(biāo)記,sleep則不會(huì)釋放鎖標(biāo)記。

####懶漢式單例設(shè)計(jì)模式中的線程安全問題

#### 線程池

> ThreadPoolExecutor類是線程池最核心的類。這個(gè)類的構(gòu)造方法中的幾個(gè)參數(shù):

>

> int corePoolSize: 核心線程數(shù)量。核心池大小。

>

> int maxmiunPoolSize: 線程池中最多的線程數(shù)量。

>

> long keepAliveTime: 核心線程之外的臨時(shí)線程,能存活的時(shí)間。(從這個(gè)線程空閑的時(shí)候開始算)

>

> TimeUnit unit: 上面的時(shí)間單位

>

>  NANOSECONDS: 納秒

>

>  MICROSECONDS: 微秒

>

>  MILLISEONDS: 毫秒

>

>  SECONDS: 秒

>

>  MINUTES: 分

>

>  HOURS: 時(shí)

>

>  DAYS: 天

>

> BlockingQueue<Runnable> workQueue: 等待隊(duì)列

>

>  ArrayBlockingQueue

>

>  LinkedBlockingQueue

>

>   SynchronousQueue

>

> RejectedExecutionHandler handler:拒絕訪問策略

“大數(shù)據(jù)線程高級(jí)部分內(nèi)容有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI