JAVA多線程(1)鎖,CAS,volatile 常見問題

拋出一個問題,自由發揮。。

 

請描述Synchronized和reentrantlock的底層實現以及衝入的底層原理

https://blog.csdn.net/Aqu415/article/details/102930585

 

請描述鎖的四種狀態和升級過程

鎖有四種狀態:無鎖狀態、偏向鎖、輕量級鎖、重量級鎖

隨着鎖的競爭,鎖的狀態會從偏向鎖到輕量級鎖,再到重量級鎖。而且鎖的狀態只有升級,沒有降級。也就是隻有偏向鎖->輕量級鎖->重量級鎖,沒有重量級鎖->輕量級鎖->偏向鎖。

鎖狀態的改變是根據競爭激烈程度進行的,在幾乎無競爭的條件下,會使用偏向鎖,在輕度競爭的條件下,會由偏向鎖升級爲輕量級鎖, 在重度競爭的情況下,會升級到重量級鎖。

 

CSA的ABA問題如何解決

 

請談一下AQS,爲什麼AQS的是底層CSA+volatile

 

請談一下對volatile的理解

https://www.cnblogs.com/dolphin0520/p/3920373.html

 

CAS是什麼?

compare and swap

 

請描述對象的創建過程

 

對象在內存中的內存佈局

https://blog.csdn.net/John8169/article/details/83054325

 

DCL單例爲什麼要加volatile

 

解釋一下鎖的四種狀態

鎖有四種狀態:無鎖狀態、偏向鎖、輕量級鎖、重量級鎖

隨着鎖的競爭,鎖的狀態會從偏向鎖到輕量級鎖,再到重量級鎖。而且鎖的狀態只有升級,沒有降級。也就是隻有偏向鎖->輕量級鎖->重量級鎖,沒有重量級鎖->輕量級鎖->偏向鎖。

鎖狀態的改變是根據競爭激烈程度進行的,在幾乎無競爭的條件下,會使用偏向鎖,在輕度競爭的條件下,會由偏向鎖升級爲輕量級鎖, 在重度競爭的情況下,會升級到重量級鎖。

 

Object o = new Object()在內存中佔了多少個字節

內存堆裏面申請一塊區域

markword

ka

instance state

 

必須能被8整除

 

請描述synchronized和ReentrantLock的異同

1、區別:
1)Lock是一個接口,synchronized是Java中的關鍵字,synchronized是內置的語言實現;
2)synchronized發生異常時,會自動釋放線程佔用的鎖,故不會發生死鎖現象。Lock發生異常,若沒有主動釋放,極有可能造成死鎖,故需要在finally中調用unLock方法釋放鎖;
3)Lock可以讓等待鎖的線程響應中斷,使用synchronized只會讓等待的線程一直等待下去,不能響應中斷
4)通過Lock可以知道有沒有成功獲取到鎖,synchronized就不靈
5)Lock可以提高多個線程進行讀操作的效率
2、在鎖概念上的區別:
1)可中斷鎖
響應中斷的鎖,Lock是可中斷鎖(體現在lockInterruptibly()方法),synchronized不是。如果線程A正在執行鎖中代碼,線程B正在等待獲取該鎖。時間太長,線程B不想等了,可以讓它中斷自己。
2)公平鎖
儘量以請求鎖的順序獲取鎖。比如同時有多個線程在等待一個鎖,當鎖被釋放後,等待時間最長的獲取該鎖,跟京牌司法拍賣一個道理。非公平鎖可能會導致有些線程永遠得不到鎖,synchronized是非公平鎖,ReentrantLock是公平鎖。
3)讀寫鎖
讀寫鎖將對一個資源(如文件)的訪問分爲2個鎖,一個讀鎖,一個寫鎖;讀寫鎖使得多個線程的讀操作可以併發進行,不需同步。而寫操作就得需要同步,提高了效率
ReadWriteLock就是讀寫鎖,是一個接口,ReentrantReadWriteLock實現了這個接口。可通過readLock()獲取讀鎖,writeLock()獲取寫鎖
4)綁定多個條件
一個ReentrantLock可以綁定多個Condition對象,僅需多次調用new Condition()即可;而在synchronized中鎖鎖對象的wait()、notify()/notifyAll()可以實現一個隱含的條件,如果要和多餘的條件關聯,就不得不額外的增加一個鎖。
3、性能比較:
大量線程同時競爭,ReentrantLock要遠勝於synchronized。
JDK5中,synchronized是性能低效的,因爲這是一個重量級操作,對性能的最大影響是阻塞的實現,掛起線程和恢復線程的操作,都需要轉入內核態中完成,給併發帶來了很大壓力。
JDK6中synchronized加入了自適應自旋、鎖消除、鎖粗化、輕量級鎖、偏向鎖等一系列優化,官方也支持synchronized,提倡在synchronized能實現需求的前提下,優先考慮synchronized來進行同步。

 

聊聊你對as-if-serial 和 haappens-bofore 語義的理解

https://blog.csdn.net/byhook/article/details/87971081

 

你瞭解ThreadLocal 嗎?你知道ThreadLocal中如何解決內存泄漏問題?

https://blog.csdn.net/puppylpg/article/details/80433271

 

請描述一下鎖的分類

  • 樂觀鎖/悲觀鎖
  • 獨享鎖/共享鎖
  • 互斥鎖/讀寫鎖
  • 可重入鎖
  • 公平鎖/非公平鎖
  • 分段鎖
  • 偏向鎖/輕量級鎖/重量級鎖
  • 自旋鎖

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章