免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
java面試題 --- 并發(fā)①

1. 什么叫死鎖?

  • 死鎖就是多個(gè)線程對自己持有的資源不釋放,同時(shí)又去申請對方持有的資源,形成循環(huán)等待。

2. 什么是樂觀鎖?什么是悲觀鎖?

  • 樂觀鎖就是很樂觀,認(rèn)為別人不會(huì)修改它的數(shù)據(jù),不會(huì)上鎖,每次操作前會(huì)判斷別人有沒有改過它的數(shù)據(jù),CAS 就屬于樂觀鎖;
  • 悲觀鎖就是很悲觀,認(rèn)為別人一定會(huì)改它的數(shù)據(jù),每次操作都會(huì)上鎖,Synchronized 和 ReentrantLock 都是悲觀鎖。

3. 什么是自旋鎖?適應(yīng)性自旋鎖呢

  • 阻塞和喚醒線程需要系統(tǒng)切換CPU狀態(tài),這個(gè)開銷是比較大的。如果一段代碼的執(zhí)行時(shí)間很短,剛阻塞線程,代碼就執(zhí)行完了,接著又喚醒線程,這種方式效率不高,倒不如讓線程不阻塞,等代碼執(zhí)行完。那么就可以讓線程自旋,不必阻塞,等前面線程執(zhí)行完它就可以獲取資源,這就是自旋鎖。實(shí)現(xiàn)原理就是 CAS。適應(yīng)性自旋鎖就是虛擬機(jī)會(huì)判斷自旋獲取到鎖的概率大不大,如果大,就自旋,如果不大,就阻塞線程。

4. 什么是共享鎖?什么是獨(dú)占鎖?

  • 共享鎖就是可以同時(shí)被多個(gè)線程持有,一個(gè)資源被加上共享鎖后,那么其他線程也只能對其加共享鎖。獲得共享鎖的線程只能讀數(shù)據(jù),不能寫數(shù)據(jù)。ReentrantReadWriteLock 的讀鎖是共享鎖,寫鎖是獨(dú)占鎖。
  • 獨(dú)占鎖又叫排他鎖,同一時(shí)刻只能被一個(gè)線程持有,獲取到鎖的線程可以對資源進(jìn)行讀寫操作。Synchronized 和 ReentrantLock 就是獨(dú)占鎖。

5. 什么是可重入鎖?

  • 可重入鎖又叫遞歸鎖,就是一個(gè)線程獲取到鎖后,就可以進(jìn)入它同步著的所有代碼,即使內(nèi)層函數(shù)也被鎖住,也無需重新獲取鎖,Synchronized 和 ReentrantLock 都是可重入鎖。

6. 可重入鎖的原理是什么?

  • 有個(gè) state 變量,線程獲取到鎖就加 1,釋放鎖就減 1,線程獲取鎖的時(shí)候會(huì)判斷 state 是不是 0,是 0 就讓線程獲取鎖,state 加 1,如果不是 0,但是當(dāng)前持有鎖的線程等于當(dāng)前線程,state 也會(huì)加 1。

7. 公平鎖和非公平鎖有什么區(qū)別?

  • 公平鎖就是按照申請鎖的順序去獲取鎖,先來后到,而非公平鎖并不會(huì)按照順序,在高并發(fā)的情況下可能出現(xiàn)優(yōu)先級反轉(zhuǎn)和饑餓現(xiàn)象,就是優(yōu)先級高的反而后獲取到鎖,或者某些線程一直沒有獲取到鎖。Synchronized 就是非公平鎖,ReentrantLock 可以默認(rèn)非公平鎖,可以通過參數(shù)設(shè)置為公平鎖。

8. CAS 是什么,會(huì)有什么問題嗎?怎么解決?

  • CAS 就是比較并交換,它有三個(gè)操作數(shù),內(nèi)存值,期望值,更新值。當(dāng)且僅當(dāng)內(nèi)存值等于期望值時(shí),才會(huì)把內(nèi)存值修改為更新值,它以自旋的方式同步線程,減少了線程切換的開銷。它會(huì)出現(xiàn) ABA 問題,就是線程 1 將共享變量 A 改為 B,再改為 A,線程 2 去判斷的時(shí)候,以為沒有別的線程改過,解決辦法是可以每次操作都加個(gè)版本號。還有個(gè)問題就是 CAS 只能保證一個(gè)變量的原子操作,可以用原子引用來解決。如果 CAS 長時(shí)間不成功,就會(huì)一直自旋,占用大量的 CPU,可以加次數(shù)限制。CAS 底層是通過內(nèi)存偏移量來獲取內(nèi)存值的。

9. 說說你對 AQS 的理解?

  • AQS,又叫抽象隊(duì)列同步器,它是 JUC 的基石。JUC 包下的鎖、并發(fā)工具,都有一些相似的代碼,然后把這些代碼抽取出來,就是 AQS,也即 JUC 包下的都是基于 AQS 去構(gòu)建的。

10. AQS 是怎么協(xié)調(diào)工作的?

  • AQS 底層是通過 LockSupport 實(shí)現(xiàn)的。LockSupport 是等待喚醒的另一種實(shí)現(xiàn)方式,它使用一個(gè)通行證的概念。每個(gè)線程都有一個(gè)通行證,通行證的數(shù)量只可能為 0 或者 1,默認(rèn)是 0。調(diào)用 unpark 方法的時(shí)候會(huì)發(fā)放一個(gè)通行證,線程就會(huì)被喚醒;調(diào)用 park 方法的時(shí)候,就會(huì)消耗一個(gè)通行證,線程就會(huì)被阻塞。park 和 unpark 方法底層是調(diào)用了 unsafe 類的 native 方法。

11. AQS 的工作原理是什么?

  • 有個(gè) volatile 修飾的 int 類型的 state 變量,用來表示同步狀態(tài),將線程封裝成 node 節(jié)點(diǎn),通過內(nèi)置的隊(duì)列來完成資源的獲取和排隊(duì)工作,用 CAS 來完成對狀態(tài)的修改。

12. 線程申請資源的時(shí)候,AQS 是怎么進(jìn)行入隊(duì)和出隊(duì)工作的?

  • 入隊(duì):假如現(xiàn)在線程 A 正持有鎖,此時(shí)線程 B 想獲取鎖,就要進(jìn)入到隊(duì)列中等待。如果隊(duì)列還是空的,首先會(huì)創(chuàng)建一個(gè)節(jié)點(diǎn),稱為傀儡節(jié)點(diǎn),然后把隊(duì)列的 head 指針和 tail 指針都指向它,然后把線程 B 封裝成一個(gè)節(jié)點(diǎn),然后把這個(gè)節(jié)點(diǎn)的 prev 指向傀儡節(jié)點(diǎn),把傀儡節(jié)點(diǎn)的 next 指向該節(jié)點(diǎn),最后把 tail 指針指向該節(jié)點(diǎn)。
  • 出隊(duì):假如現(xiàn)在線程 A 釋放鎖了,那么線程 B 對應(yīng)的節(jié)點(diǎn)就應(yīng)該出隊(duì)。首先會(huì)把 head 指向線程 B 對應(yīng)的節(jié)點(diǎn),然后把線程 B 對應(yīng)節(jié)點(diǎn)的線程設(shè)置為空,接著把該節(jié)點(diǎn)的 prev 設(shè)置為空,把傀儡節(jié)點(diǎn)的 next 設(shè)置為空,這樣一來,原先線程 B 所在的節(jié)點(diǎn)就成了新的傀儡節(jié)點(diǎn),原先的傀儡節(jié)點(diǎn)就沒有任何引用指向它,就會(huì)被 GC 回收。

13. 你知道哪些并發(fā)關(guān)鍵字?

  • synchronized,volatile、final。

14. 說說你對 synchronized 的理解?

  • 它是一個(gè)關(guān)鍵字,是可重入的非公平鎖??梢孕揎棇?shí)例方法、靜態(tài)方法和代碼塊。修飾實(shí)例方法時(shí)鎖對象是實(shí)例,修飾靜態(tài)方法時(shí)鎖對象是當(dāng)前類,修飾代碼塊時(shí)鎖對象可以任意對象。修飾方法時(shí),通過 javap 命令反匯編可以看到它是通過 ACC_SYNCHRONIZED 標(biāo)識來實(shí)現(xiàn)同步的;而修飾代碼塊時(shí)是通過 monitor 對象來實(shí)現(xiàn)同步的,monitorenter 指向鎖開始的地方,monitorexist 指向鎖退出的地方,并且有兩個(gè) monitorexist,是為了防止程序異常導(dǎo)致鎖未釋放。

15. 鎖狀態(tài)有哪些?
無鎖、偏向鎖、輕量級鎖、重量級鎖。

  • 無鎖就是不阻塞線程,在循環(huán)內(nèi)不斷地嘗試,CAS 便是無鎖的實(shí)現(xiàn);
  • 偏向鎖就是在鎖對象頭里會(huì)保存當(dāng)前持鎖的線程 ID,如果申請資源的線程 ID 等于對象頭里保存的線程 ID,那就直接讓線程獲取鎖;
  • 輕量級鎖就是當(dāng)鎖是偏向鎖時(shí)別的線程進(jìn)來請求資源了,那就會(huì)自旋一定次數(shù)去嘗試獲取鎖,自旋一定次數(shù)沒獲取到,又或者是一個(gè)線程持有鎖,一個(gè)在自旋,第三個(gè)線程進(jìn)來了,都會(huì)升級為重量級鎖;
  • 重量級鎖就是等待鎖的線程都會(huì)阻塞。

掃描二維碼

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
轉(zhuǎn)載:從synchronized 到CAS 和 AQS徹底弄懂Java各種并發(fā)鎖
系統(tǒng)梳理一下鎖
【死磕Java并發(fā)】—–J.U.C之重入鎖:ReentrantLock
Java并發(fā)-AQS及各種Lock鎖的原理
AQS解析
學(xué)習(xí)JUC源碼(2)——自定義同步組件
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服