面試系列 JUC中常見的鎖

2021-10-04 17:56:25 字數 2504 閱讀 8923

公平鎖:是指多個執行緒按照申請鎖的順序來獲取鎖類似排對打飯,先來後到

非公平鎖:是指在多執行緒獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的執行緒比先申請的執行緒優先獲取到鎖,在高併發的情況下,有可能造成優先順序反轉或者飢餓現象

並發包reentrantlock的建立可以指定建構函式的boolean型別來得到公平鎖或者非公平鎖 預設是非公平鎖,通過構造哈數指定該鎖是否是公平鎖 預設是非公平鎖 非公平鎖的優點在於吞吐量必公平鎖大

兩者的區別:

公平鎖就是很公平,在併發環境中,每個執行緒在獲取鎖時會先檢視此鎖維護的等待佇列,如果為空或者當前等待佇列的第乙個,就佔鎖,否則就會加入到等待佇列中,以後會按照fifo的規則中獲取每乙個執行緒。

非公平鎖:非公平鎖就比較粗魯,當需要鎖的時候,就跳過佇列中其他執行緒的等待,直接去獲取鎖,如果失敗就在採用公平鎖的這種方式。

可重入鎖:是指同乙個執行緒外層函式獲得鎖之後,內層遞迴函式仍然能獲取該鎖的**,在同乙個執行緒在外層方法獲取到鎖,內層方法會自動的獲取鎖,也即是說,執行緒可以進入任何乙個它已經擁有鎖所在的同步**塊中。其中reentrantlock/synchronized就是乙個典型的可重入鎖。可重入鎖最大的作用就是可以避免死鎖。

下面**驗證synchronized和reentrantlock鎖

class

phone

implements

runnable

public

synchronized

void

sendemails()

throws exception

}public

class

reenterlockdemo

catch

(exception e)},

"t1").

start()

;new

thread((

)->

catch

(exception e)},

"t2").

start()

;}}

class

phone

implements

runnable

public

void

get(

)catch

(exception e)

finally

}public

void

set(

)catch

(exception e)

finally}}

public

class

reenterlockdemo

}

自旋鎖是指嘗試獲取鎖的執行緒不會立即阻塞,而是採用迴圈的方式去嘗試獲取鎖,這樣的好處就是減少執行緒上下文切換的消耗,缺點是是迴圈會消耗cpu

手寫乙個自旋鎖

public

class

spinlockdemo

}public

void

myunlock()

public

static

void

main

(string[

] args)

catch

(interruptedexception e)

spinlockdemo.

myunlock()

;},"t1").

start()

;new

thread((

)->

,"t2").

start()

;}}

獨佔鎖:指該鎖一次只能有乙個執行緒持有。對於reentranlock和synchronized而言就是獨佔鎖。

共享鎖:指該鎖可以被多個執行緒持有。對於reentrantreadwritelock其中讀鎖就是共享鎖,寫鎖是獨佔鎖。

在多個執行緒同時操作 乙個資源類沒有任何問題 所以為了滿足併發量讀取共享資源應該可以同時進行,但是如果有乙個執行緒想去寫共享資源來 就不應該有其他執行緒可以對資源進行讀或寫。

下面是乙個讀寫鎖的demo

class

mycache

catch

(exception e)

finally

}public

void

read

(string key)

catch

(exception e)

finally}}

public

class

readwritelockdemo

,string.

valueof

(i))

.start()

;}for(

int i =

0; i <

5; i++

),string.

valueof

(i))

.start()

;}}}

面試系列 JUC中常見的鎖

公平鎖 是指多個執行緒按照申請鎖的順序來獲取鎖類似排對打飯,先來後到 非公平鎖 是指在多執行緒獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的執行緒比先申請的執行緒優先獲取到鎖,在高併發的情況下,有可能造成優先順序反轉或者飢餓現象 並發包reentrantlock的建立可以指定建構函式的boole...

24 JUC中常見的集合

juc集合包中的list和set juc集合包中map juc包中queue concurrenthashmap concurrentskiplistmap copyonwritearraylist concurrentskiplistset copyonwritearrayset concurre...

面試中常見的網路問題

一 ping命令使用了什麼協議?使用的是icmp協議,是tcp ip的子協議,用於在ip主機 路由器之間傳遞控制資訊。二 常見的http狀態碼 http狀態碼是由三位數字組成的,第乙個數字定義了響應的類別 1xx 指示資訊,表示請求接收,繼續處理。2xx 表示請求成功 3xx 重定向 4xx 客戶端...