1.synchronied原理:是由jvm實現的一種互斥同步的一種方式,被它所修飾過的**塊,
編譯後的位元組碼,會發現在編譯前後被編譯器生成了monitorenter和
monitoreixt兩個位元組碼指令。
在虛擬機器執行到monitorenter指令時,首先要嘗試獲取物件的鎖:如果這個物件
沒有鎖定,或者當前執行緒已經擁有了這個物件的鎖,把鎖的計數器+1;當執行monitorexit
指令時將鎖計數器 - 1;當計數器為0的時候,鎖就被釋放了。
(a)如果獲取物件的鎖失敗了,那麼當前執行緒就要阻塞等待,直到物件鎖被另外乙個執行緒釋放。
(b)j**a中的sychronized 通過在物件頭設定標記,達到了獲取鎖和釋放鎖的目的。
2.什麼是可重入性,為什麼sychronized 是可重入鎖
可重入性是鎖的乙個基本要求,是為了解決自己鎖死自己的情況。例如:乙個類中的同步方法呼叫
另乙個同步方法,假如不支援同步,進入method2方法時當前執行緒獲得鎖,method2方法裡面執行
method1時當前執行緒又要去嘗試獲得鎖,這時如果不支援重入,就要等它釋放,把自己阻塞了。
在執行monitorenter指令時,如果這個物件沒有鎖定,或者當前執行緒已經擁有鎖了,就把鎖的計數器
+ 1,其本質上就是通過這種方式實現了可重入性。
3.jvm對 j**a的原生鎖做了哪些優化
這時候就無須再讓執行緒執行阻塞操作,避免了狀態切換。
(偏向鎖)
(輕量鎖)
(重量鎖)
這三種鎖使得jdk得以優化sychronized的執行,當jvm檢測到不同的鎖競爭狀況時,會自動切換到合適的鎖
實現,這就是鎖的公升級,降級。當鎖沒有競爭的時候,預設是偏向鎖。
輕量級鎖依賴cas操作,mark word 來試圖獲取鎖,如果重試成功的話,就使用普通的輕量級鎖,否則,
進一步公升級為重量級鎖。
4.為什麼synchronized是非公平的
非公平主要表現在獲取鎖的行為上,並非是按照申請時間前後給等待執行緒分配鎖的。每當鎖被釋放後,
任何乙個執行緒都有機會競爭到鎖,這樣做的目的是為了提供效能。缺點是產生執行緒飢餓現象。
5.鎖消除
虛擬機器在即時編譯的時候,對一些**上要求同步,但被檢測到實際不存在共享資料競爭的鎖進行消除。
鎖粗化:
原則上同步塊的作用範圍要盡量小。但是如果一系列的連續操作都對同乙個物件反覆進行加鎖和解鎖。甚至加鎖
在迴圈操作內,導致效能消耗。鎖粗化就是增大鎖的作用範圍。
面試那些事! 併發程式設計
為什麼要使用併發程式設計?提公升多核cpu的利用率 一般來說一台主機上的會有多個cpu核心,我們可以建立多個執行緒,理論上講作業系統可以將多個執行緒分配給不同的cpu去執行,每個cpu執行乙個執行緒,這樣就提高了cpu的使用效率,如果使用單執行緒就只能有乙個cpu核心被使用。簡單來說就是 充分利用c...
Python面試題 網路程式設計和併發
1 簡述 osi 七層協議。2 什麼是c s和b s架構?3 簡述 三次握手 四次揮手的流程。4 什麼是arp協議?5 tcp和udp的區別?6 什麼是區域網和廣域網?7 為何基於tcp協議的通訊比基於udp協議的通訊更可靠?8 什麼是socket?簡述基於tcp協議的套接字通訊流程。9 什麼是粘包...
併發程式設計學習 併發程式設計的挑戰
死鎖 資源限制的挑戰 併發程式設計的目的是為了讓程式執行的更快,但是並不是啟動更多的執行緒,就能讓程式最大限度的併發執行。在進行併發程式設計時,如果希望通過多執行緒執行任務讓程式執行的更快,會面臨非常多的挑戰,比如上下文切換的問題,死鎖的問題,以及受限於硬體和軟體的資源限制問題 即使是單核處理器也支...