jdk源碼小記——鎖機制(ReentrantLock源碼解析)

鎖的具體含義和使用方式,在操作系統裏面已經有了比較詳細的講解,就不在這裏贅述了。本小節主要講解一下Java當中的鎖的實現和使用(其實jvm是用c++寫的,所以最終的實現和操作系統提供的鎖機制有很大的干係)

synchronized
該關鍵字也是是jdk提供的一種隱性的鎖機制,需要特別注意的有以下幾點:
1、用在靜態方法,鎖的是類對象(類本身也是一個對象,是描述對象的對象),即class對象。
2、用在對象方法,鎖的是通過類生成的對象。

其餘的各種方式都符合這兩種規則,可以根據不同的需求調整不同的鎖的粒度

ReentrantLock
在瞭解該鎖的實現之前,需要對下面幾個概念進行了解:
自旋鎖:一個線程會一直在CPU上檢測鎖的條件是否滿足,該鎖的機制會使得線程一直佔用CPU,比較適合短任務線程之間的鎖的競爭(因爲短任務的競爭不會導致線程上下文的切換)
CLH:CLH的講解,這是一篇不錯的文章

公平鎖的實現
多線程鎖的爭用的調度時隨機的,那麼如何保證線程對鎖的爭用是順序進行的呢,CLH這種數據結構就是爲了保證線程對鎖的爭用順序的進行。

從上面可以看出如果線程阻塞在操作系統的鎖的等待隊列中,操作系統對線程的調度時隨機的,無法控制順序。但是在jdk中通過CLH來保證這種順序關係,這種關係就類似於後面一個線程完全依賴於前一個線程的鎖的佔用情況,這種情況下就意味着後面進來的線程必須等待前面的線程對鎖使用完畢之後,才能擁有對鎖的爭用權利(只是擁有競爭鎖的權利,但是不一定能夠保證能獲取到鎖,這個概念有點繞,是屬於層是操作系統層面的概念了,不細講,只要記住只是獲取了爭用鎖的權利,而不是百分百保證能獲取鎖)

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