java多線程并發(fā)面試題 多線程編程的時(shí)候,使用無鎖結(jié)構(gòu)會(huì)不會(huì)比有鎖結(jié)構(gòu)更加快?
多線程編程的時(shí)候,使用無鎖結(jié)構(gòu)會(huì)不會(huì)比有鎖結(jié)構(gòu)更加快?這是毫無疑問的,因?yàn)榫€程鎖定是資源密集型的!那么,如何避免鎖的性能下降呢?1、從業(yè)務(wù)上避免大量鎖結(jié)構(gòu)!2. 使用ThreadLocal,可以保證每
多線程編程的時(shí)候,使用無鎖結(jié)構(gòu)會(huì)不會(huì)比有鎖結(jié)構(gòu)更加快?
這是毫無疑問的,因?yàn)榫€程鎖定是資源密集型的
!那么,如何避免鎖的性能下降呢?
1、從業(yè)務(wù)上避免大量鎖結(jié)構(gòu)
!2. 使用ThreadLocal,可以保證每個(gè)線程中的數(shù)據(jù)不會(huì)互相污染
!3. 如果讀多寫少,請(qǐng)使用讀寫鎖
!4. 自旋鎖將挑戰(zhàn)CPU,盡管它是一個(gè)線程時(shí)間很少的鎖
!5. 鎖的粒度應(yīng)該盡可能?。喝绻i可以在方法中,就不應(yīng)該占用整個(gè)方法
例如,如何使用compareandswap實(shí)現(xiàn)原子操作而不鎖定一個(gè)簡(jiǎn)單的int變量?
因?yàn)閮蓚€(gè)線程可能同時(shí)獲得此變量,如果兩個(gè)線程幾乎同時(shí)比較,則可能同時(shí)為真。
底層是否有類似鎖的實(shí)現(xiàn)?
以go中的coroutine為例:
package main
import(
“FMT”
]“sync”
“sync/atomic”
var counter int32=0
func main(){
n:=100
WG:=New(sync.WaitGroup組)
工作組添加(n)
對(duì)于i:=0 i<n i{
go inc(i,wg)
}等等()
格式打?。ㄓ?jì)數(shù)器)
}
func inc(i int,wg*sync.WaitGroup組){
推遲工作組完成()
自旋:=0
對(duì)于{
舊:=counter
如果原子.CompareAndSwapInt32(&counter,old,old 1){
break
}否則{
spin
}
}
如果spin> 0{格式打?。ā癐,as:”,I,“,自旋數(shù):”,旋轉(zhuǎn))
}]}]不要鎖定計(jì)數(shù)器。在Inc方法中,如果兩個(gè)goroutine在執(zhí)行old:=counter步驟時(shí)獲得相同的計(jì)數(shù)器,那么兩個(gè)goroutine是否可能獲得相同的計(jì)數(shù)器如果不可能,原理是什么?
在CAS中,如何保證兩個(gè)線程的compare結(jié)果不是同時(shí)為true?
這是培訓(xùn)機(jī)構(gòu)告訴你的嗎?具體的年薪不僅僅是一個(gè)廣告的問題,還取決于你完成學(xué)業(yè)后去哪一個(gè)城市,去哪一類公司。一般的培訓(xùn)機(jī)構(gòu)會(huì)吹噓自己有一種特殊的技能,但事實(shí)可能并非如此