我知道的是,writelock就像同步。ReentrantReadWriteLock,ReadLock和WriteLock有什麼區別
Readlock和Writelock以某種方式相互影響。
ReadLock似乎不能單獨工作。
我知道的是,writelock就像同步。ReentrantReadWriteLock,ReadLock和WriteLock有什麼區別
Readlock和Writelock以某種方式相互影響。
ReadLock似乎不能單獨工作。
readLock.lock();
這意味着,如果任何其他線程是寫作(即持有的寫鎖),然後停在這裏,直到沒有其他線程寫。
一旦授予鎖定,將不允許其他線程到寫入(即進行寫入鎖定),直到鎖定被釋放。
writeLock.lock();
這意味着,如果任何其他線程是閱讀或寫,停在這裏等待,直到沒有其他線程讀取或寫入。
一旦鎖被授予,沒有其他的線程將被允許讀或寫入(即採取一個讀或寫鎖定),直到鎖被釋放。
結合這些,你可以在一個時間安排只有一個線程有寫權限但很多讀者,只要你喜歡當一個線程正在寫,除了可以在同一時間讀取。
換句話說。每次你想從結構讀取,取一個讀取鎖定。每當你想寫,拿一個寫鎖。通過這種方式,只要沒有人正在閱讀(您可以想象您擁有獨家訪問權限),但只要沒有人在寫作,就可以有許多閱讀器在同一時間閱讀。
爲ReadWriteLock
的文檔說明了這一點:
一個ReadWriteLock中維護一對相關的鎖,一個用於只讀操作,另一個用於寫入。只要沒有寫入器,讀取鎖可以由多個讀取器線程同時保存。寫鎖定是獨佔的。
所以你一次可以有很多讀者,但是隻有一個作家 - 而且作者也會阻止讀者閱讀。如果您有一些可以安全地從多個線程讀取的資源,並且其中讀取比寫入更普遍,但資源不是實際上是只讀,那麼這非常有用。 (如果沒有作家,閱讀是安全的,沒有必要的鎖都沒有。)
當一個線程獲取WriteLock
,沒有其他線程可以獲取ReadLock
也不是ReentrantReadWriteLock
同一個實例的WriteLock
,除非該線程釋放鎖定。但是,多個線程可以同時獲取ReadLock
。
+1很好的解釋。只是爲了澄清,「一」是指「線程」。 –