日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

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

 貪挽懶月 2022-06-20 發(fā)布于廣東

1. 什么叫死鎖?

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

2. 什么是樂(lè)觀鎖?什么是悲觀鎖?

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

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

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

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

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

5. 什么是可重入鎖?

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

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

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

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

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

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

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

9. 說(shuō)說(shuō)你對(duì) AQS 的理解?

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

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

  • AQS 底層是通過(guò) 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 變量,用來(lái)表示同步狀態(tài),將線程封裝成 node 節(jié)點(diǎn),通過(guò)內(nèi)置的隊(duì)列來(lái)完成資源的獲取和排隊(duì)工作,用 CAS 來(lái)完成對(duì)狀態(tài)的修改。

12. 線程申請(qǐng)資源的時(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 對(duì)應(yīng)的節(jié)點(diǎn)就應(yīng)該出隊(duì)。首先會(huì)把 head 指向線程 B 對(duì)應(yīng)的節(jié)點(diǎn),然后把線程 B 對(duì)應(yīng)節(jié)點(diǎn)的線程設(shè)置為空,接著把該節(jié)點(diǎn)的 prev 設(shè)置為空,把傀儡節(jié)點(diǎn)的 next 設(shè)置為空,這樣一來(lái),原先線程 B 所在的節(jié)點(diǎn)就成了新的傀儡節(jié)點(diǎn),原先的傀儡節(jié)點(diǎn)就沒(méi)有任何引用指向它,就會(huì)被 GC 回收。

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

  • synchronized,volatile、final。

14. 說(shuō)說(shuō)你對(duì) synchronized 的理解?

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

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

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

掃描二維碼

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多