讀寫(xiě)鎖適用于讀多寫(xiě)少的場(chǎng)景
三條原則:1.允許多個(gè)線(xiàn)程同時(shí)讀共享變量;? 2.只允許一個(gè)線(xiàn)程寫(xiě)共享變量;? ?3.如果一個(gè)寫(xiě)線(xiàn)程正在執(zhí)行寫(xiě)操作,此時(shí)禁止讀線(xiàn)程讀或?qū)懝蚕碜兞俊??

讀寫(xiě)鎖的升級(jí)與降級(jí)
讀寫(xiě)鎖升級(jí):從讀鎖變成寫(xiě)鎖, ReadWriteLock不支持??!

讀寫(xiě)鎖降級(jí):從寫(xiě)鎖變?yōu)樽x鎖??ReadWriteLock支持

為什么要在寫(xiě)鎖中獲取讀鎖(為什么支持鎖降級(jí))?? ? 為了保證數(shù)據(jù)的可見(jiàn)性。假設(shè)兩個(gè)線(xiàn)程A、B。如果寫(xiě)鎖里沒(méi)有讀鎖,線(xiàn)程A寫(xiě)完后,釋放寫(xiě)鎖;線(xiàn)程B獲得了寫(xiě)鎖,并寫(xiě)了數(shù)據(jù),也釋放了;但是線(xiàn)程A并沒(méi)有結(jié)束,需要繼續(xù)使用數(shù)據(jù),但是此時(shí)數(shù)據(jù)已經(jīng)被B修改了。? 如果有讀鎖,線(xiàn)程A即使釋放了寫(xiě)鎖,由于讀寫(xiě)的互斥性,線(xiàn)程A仍持有讀鎖,線(xiàn)程B無(wú)法獲得寫(xiě)鎖,會(huì)被阻塞。
獲取寫(xiě)鎖的前提是,其他線(xiàn)程沒(méi)有占用寫(xiě)鎖和讀鎖,自己的線(xiàn)程也沒(méi)有占用讀鎖。
獲取讀鎖的前提是,其他線(xiàn)程沒(méi)有占用寫(xiě)鎖,自己線(xiàn)程占用寫(xiě)鎖是可以獲取的。