讀寫鎖顧名思義就是提供了一個讀鎖、一個寫鎖,其中讀鎖是共享鎖,寫鎖是獨占鎖。
讀鎖同時可以有多個線程獲取,獲取的前提是沒有其他線程的寫鎖(當然還有同時并發數限制,不過普通java進程也不會起那么多的線程);
寫鎖同時只能有一個線程獲取,獲取的前提是沒有讀鎖和非本線程的寫鎖
ReentrantReadWriteLock 通過state字段的高低位分別控制讀鎖和寫鎖,低16位表示寫鎖,高16位表示讀鎖
讀鎖獲取流程:
讀鎖釋放流程:
寫鎖獲取流程:
寫鎖釋放流程:
注:
只有獨占鎖的線程可以重入,所以線程獲得寫鎖之后可以繼續重入;
而獲得讀鎖之后接著去取寫鎖會被永遠阻塞,讀鎖是共享的,而且沒有記錄所有共享的線程,上面的流程可以看出獲取寫鎖的時候只要存在讀鎖,就會失敗,所以線程不釋放自己的讀鎖就永遠獲取不到寫鎖。
當然,獲取讀鎖之后是可以再次獲取讀鎖的,這也不算是重入,而是線程與自己共享。
新聞熱點
疑難解答