公平鎖:是指多個執行緒按照申請鎖的順序來獲取鎖類似排對打飯,先來後到
非公平鎖:是指在多執行緒獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的執行緒比先申請的執行緒優先獲取到鎖,在高併發的情況下,有可能造成優先順序反轉或者飢餓現象
並發包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 客戶端...