您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java中鎖的面試題實(shí)例分析”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java中鎖的面試題實(shí)例分析”吧!
1.synchronized作用于靜態(tài)方法和非靜態(tài)方法的區(qū)別
非靜態(tài)方法:
給對象加鎖(可以理解為給這個(gè)對象的內(nèi)存上鎖,注意 只是這塊內(nèi)存,其他同類對象都會(huì)有各自的內(nèi)存鎖),這時(shí)候在其他一個(gè)以上線程中執(zhí)行該對象的這個(gè)同步方法(注意:是該對象)就會(huì)產(chǎn)生互斥
靜態(tài)方法: 相當(dāng)于在類上加鎖(*.class位于代碼區(qū),靜態(tài)方法位于靜態(tài)區(qū)域,這個(gè)類產(chǎn)生的對象公用這個(gè)靜態(tài)方法,所以這塊內(nèi)存,N個(gè)對象來競爭),
這時(shí)候,只要是這個(gè)類產(chǎn)生的對象,在調(diào)用這個(gè)靜態(tài)方法時(shí)都會(huì)產(chǎn)生互斥。即該類所有的對象都共享一把鎖。
2.鎖類型有哪些
(1)樂觀鎖&悲觀鎖
(2)自旋鎖&非自旋鎖
(3)可重入鎖&不可重入鎖
(4)無鎖&輕量級鎖&偏向鎖&重量級鎖
(5)互斥鎖&共享鎖
(6)公平鎖&非公平鎖
3.線程同步的幾種方式
synchronized修飾
volatile實(shí)現(xiàn)同步(只能保證可見性,不能保證原子性)
使用局部變量ThreadLocal
使用原子類(AtomicInteger、AtomicBoolean……)
使用Lock
使用容器類(BlockingQueue、ConcurrentHashMap)
4.synchronized 和 lock 機(jī)制區(qū)別
synchronized 原始采用的是 CPU 悲觀鎖機(jī)制,即線程獲得的是獨(dú)占鎖。獨(dú)占鎖意味著其 他線程只能依靠阻塞來等待線程釋放鎖。
Lock 用的是樂觀鎖方式。所謂樂觀鎖就是,每次不加鎖而是假設(shè)沒有沖突而去完成某項(xiàng)操作,如果因?yàn)闆_突失敗就重試,直到成功為止。樂觀鎖實(shí)現(xiàn)的機(jī)制就是 CAS 操作(Compare and Swap)。
5.說說線程安全的問題
線程安全是多線程領(lǐng)域的問題,線程安全可以簡單理解為一個(gè)方法或者一個(gè)實(shí)例可以在多線程環(huán)境中使用而不會(huì)出現(xiàn)問題。
在 Java 多線程編程當(dāng)中,提供了多種實(shí)現(xiàn) Java 線程安全的方式:
最簡單的方式,使用 Synchronization 關(guān)鍵字
使用 java.util.concurrent.atomic 包中的原子類,例如 AtomicInteger
使用 java.util.concurrent.locks 包中的鎖
使用線程安全的集合 ConcurrentHashMap
使用 volatile關(guān)鍵字,保證變量可見性
感謝各位的閱讀,以上就是“Java中鎖的面試題實(shí)例分析”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java中鎖的面試題實(shí)例分析這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。