synchronized 鎖的底層原理

線程A想要獲取這個對象,就去找到該對象的monitor, 看看owner是否爲空,如果爲空說明該對象沒有被鎖住,並將自己的線程ID設置進去,並count++,如果owner不爲空,則將其線程ID放到waitset隊列中,線程釋放鎖時,將owner置爲空,並count--;當線程Thread.wait()時候也會將owner置爲空,並count--; 這個過程是需要依賴於低層的操作系統的Mutex Lock來實現的,而操作系統實現線程中的切換時,需要用用戶態切換到核心態,這是一個非常重的操作,時間成本較高。這也是早期 synchronized 效率低下的原因。

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