1. 程式人生 > >Java多執行緒——自旋鎖

Java多執行緒——自旋鎖

自旋鎖(spin lock) 和 互斥鎖(mutual exclusion lock)

  • 沒有獲得鎖的呼叫者就一直迴圈在那裡看是否該自旋鎖的保持者已經釋放了鎖,這就是自旋鎖,他不用將線城阻塞起來(NON-BLOCKING);

  • 互斥鎖 最常使用於執行緒同步的鎖;標記用來保證在任一時刻,只能有一個執行緒訪問該物件。

自旋鎖的場景

真正的自旋鎖是針對多核CPU,而往往應用是單程序的,所以我們見到的自旋鎖是使用了自旋鎖的概念的一種實現,卻是針對多執行緒的。

例如Java中AtomicBoolean

image

其他型別的鎖

  • 讀寫鎖(rwlock)

    高級別鎖,區分讀和寫,符合條件時允許多個執行緒訪問物件。處於讀鎖操作時可以允許其他執行緒和本執行緒的讀鎖,但不允許寫鎖,處於寫鎖時則任何鎖操作都會睡眠等待;常見的作業系統會在寫鎖等待時遮蔽後續的讀鎖操作以防寫鎖被無限孤立而等待,在作業系統不支援情況下可以用引用計數加寫優先等待來用互斥鎖實現。

    讀寫鎖適用於大量讀少量寫的環境,但由於其特殊的邏輯使得其效率相對普通的互斥鎖和自旋鎖要慢一個數量級;值得注意的一點是按POSIX標準 線上程申請讀鎖並未釋放前本執行緒申請寫鎖是成功的,但執行後的邏輯結果是無法預測

  • 遞迴鎖(recursivelock)

    嚴格上講遞迴鎖只是互斥鎖的一個特例,同樣只能有一個執行緒訪問該物件,但允許同一個執行緒在未釋放其擁有的鎖時反覆對該鎖進行加鎖操作,但別的執行緒也只能等待該執行緒釋放所有次數的鎖才可以獲得鎖;

    windows下的臨界區預設是支援遞迴鎖的,而Linux下的互斥量則需要設定引數PTHREAD_MUTEX_RECURSIVE_NP,預設則是不支援

Refer