首頁  >  問答  >  主體

java - 讀寫鎖定中 寫鎖的降級問題

#寫鎖降級的時候 要求目前已經取得到寫鎖的執行緒把持住寫鎖,然後取得讀鎖,隨後釋放寫鎖。

那為什麼要求把持住寫鎖呢? ?

上圖中提到 「 那麼當前線程無法感知線程T的資料更新 」 這個如何理解。如果線程T獲取到了寫鎖,然後對資料進行了更新,在沒有釋放寫鎖之前,當前線程無法感知到資料的更新,這個是沒問題的吧,但是一旦線程T釋放寫鎖,那麼當前線程就可以感知到數據的更新了,這裡理解應該沒問題吧?

help me to explain,thx

大家讲道理大家讲道理2686 天前1156

全部回覆(3)我來回復

  • 習慣沉默

    習慣沉默2017-06-12 09:26:17

    這是在解釋鎖降級吧,首先寫鎖是獨佔的,讀鎖是共享的,然後讀寫鎖是線程間互斥的,鎖降級的前提是所有線程都希望對資料變化敏感,但是因為寫鎖只有一個,所以會發生降級。
    如果先釋放寫鎖,再取得讀鎖,可能在獲取之前,會有其他執行緒取得到寫鎖,阻塞讀鎖的獲取,就無法感知資料變化了。所以要先hold住寫鎖,確保資料無變化,取得讀鎖,然後再釋放寫鎖。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-06-12 09:26:17

    寫鎖定不允許其他程序的讀寫操作,讀鎖的允許讀取操作。
    就按你抓圖的例子來看,當你釋放寫鎖後,T進程獲取了寫鎖,這時你就無法獲取讀鎖了,所以要先獲取讀鎖後,再釋放寫鎖。

    首先你沒理解讀寫鎖的意義,讀鎖的存在意味著不允許其他寫入操作的存在。
    按照你提供的例子,可能存在一個事務執行緒不希望自己的操作被別的執行緒中斷,而這個事務操作可能分成多部分操作更新不同的資料(或表)甚至非常耗時。如果長時間用寫鎖獨佔,顯然對於某些高響應的應用是不允許的,所以在完成部分寫入操作後,退而使用讀鎖降級,來允許響應其他進程的讀取操作。只有當全部事務完成後才真正釋放鎖。
    按你的理解如果當中寫鎖被其他執行緒佔用,那麼這個事務執行緒將不得不中斷等待別的寫鎖釋放。

    回覆
    0
  • 我想大声告诉你

    我想大声告诉你2017-06-12 09:26:17

    「 那麼當前執行緒無法感知線程T的資料更新 」

    T1 讀取 資料 Data時,將資料值複製到目前執行緒的上下文,因此其他執行緒沒有辦法感知資料是否更新。只要當資料提交記憶體中,也就是Heap中,其他執行緒才可以得到最新值。

    回覆
    0
  • 取消回覆