前言
ReadWriteLock是一個抽象類,實現(xiàn)類為ReentrantReadWriteLock,其管理兩組鎖描融,一個讀鎖,一個寫鎖衡蚂。讀鎖可以在沒有寫鎖的情況下被多個線程持有,寫鎖是獨占的骏庸。讀寫鎖更多應(yīng)用在讀多寫少的情況下毛甲。
源碼分析
ReentrantReadWriteLock有兩個構(gòu)造方法,默認的構(gòu)造方法是不帶參數(shù)具被,內(nèi)部調(diào)用的是帶布爾參的構(gòu)造方法玻募,參數(shù)為FALSE。構(gòu)造內(nèi)部生一個NonfairSync類一姿,采用的是非公平模式七咧。當(dāng)為true的時候生成一個FairSync類,采用公平模式叮叹。
公平模式和非公平模式的區(qū)別
非公平模式:線程獲取讀鎖和寫鎖的順序不確定艾栋,采取競爭方式獲取,吞吐量比較高
公平模式:線程會以隊列有序的方式獲取鎖
公平模式和非公平模式繼承了一個抽象類蛉顽,該抽象類有兩個比較重要的方法
讀線程和寫線程是否需要阻塞蝗砾,在公平模式和非公平模式的選擇上是不一樣的。非公平模式下當(dāng)線程獲取寫線程時候携冤,不阻塞悼粮,獲取讀線程會判斷是否有寫鎖,有的話會阻塞曾棕。在公平模式下扣猫,首先會判斷線程隊列中是否有等待的線程,如果有則放入隊列中翘地,則等待時間久的線程會獲取鎖申尤。???
??? 在多線程中,要注意線程優(yōu)化衙耕,經(jīng)常使用的線程優(yōu)化就是瀑凝,偏向鎖和旋轉(zhuǎn)鎖。
偏向鎖:當(dāng)某一個線程獲得鎖之后臭杰,該線程再次獲取鎖的時候粤咪,不需要執(zhí)行相關(guān)的同步操作,就可直接獲取鎖渴杆。如果再次期間寥枝,其它的線程獲取了這個鎖宪塔,那么該鎖就退出偏向模式。該情況不適合鎖競爭比較激烈的情況囊拜。
JVM中使用 -XX:+UseBiasedLocking
自旋鎖:在多線程中線程的上下文切換會消耗計算機的資源影響其性能某筐,自旋鎖可以減少這種上下文切換的時間,當(dāng)一個線程獲取鎖沒有成功時冠跷,會自轉(zhuǎn)幾個CPU周期南誊,直到該線程獲取這個鎖。
在JDK1.6中蜜托,Java虛擬機提供-XX:+UseSpinning參數(shù)來開啟自旋鎖抄囚,使用-XX:PreBlockSpin參數(shù)來設(shè)置自旋鎖等待的次數(shù)