第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于CopyOnWriteArrayList源碼的疑惑

關于CopyOnWriteArrayList源碼的疑惑

九州編程 2019-04-13 08:46:27
jdkconcurrent包當中的CopyOnWriteArrayList定義了一個數(shù)組和一個鎖:privatevolatiletransientObject[]array;transientfinalReentrantLocklock=newReentrantLock();他的add方法如下:publicbooleanadd(Ee){finalReentrantLocklock=this.lock;lock.lock();try{Object[]elements=getArray();intlen=elements.length;Object[]newElements=Arrays.copyOf(elements,len+1);newElements[len]=e;setArray(newElements);returntrue;}finally{lock.unlock();}}問題:add方法中的finalReentrantLocklock=this.lock;這一句是不是必須的?為什么又定義了一個鎖,并且實質(zhì)用的還是全局定義的那個鎖。如果直接用this.lock可不可以?如果不用getArray直接寫成intlen=array.length;Object[]newElements=Arrays.copyOf(array,len+1);newElements[len]=o;array=newElements;是不是也可以?
查看完整描述

2 回答

?
慕田峪9158850

TA貢獻1794條經(jīng)驗 獲得超7個贊

是的。用局部變量lock來引用自身的成員變量當然不是必須的。我認為這是編程演進過程所引入的,很可能和內(nèi)部執(zhí)行的規(guī)范有關。
例如:內(nèi)部規(guī)范上可能是要求盡量使用accessor來使用成員變量,避免直接使用。即使需要直接使用,最好先用局部變量來引用它。這樣做的好處是,這個函數(shù)自身具有很好的完備性。設想如果此類如果修改,將lock成員變量取消或者更改類型,如果直接在代碼各處引用lock,勢必造成很多修改。而在目前的實現(xiàn)上,不過是將finalReentrantLocklock=this.lock;改成finalReentrantLocklock=getLock();影響小得多,語義十分清晰。
同樣,對成員變量array的引用也是這樣,通過使用accessorgetArray(),代碼可以將對成員變量的依賴降低到對一個成員函數(shù)的依賴,這對維護也非常有好處。
感謝題主引用了很好的一段程序,提出了一個非常完整的問題。
                            
查看完整回答
反對 回復 2019-04-13
?
慕無忌1623718

TA貢獻1744條經(jīng)驗 獲得超4個贊

應該還有性能上的考慮.在java函數(shù)棧幀的本地變量里存入對域成員對象的引用,相當于一個空間換時間的做法.畢竟取本地變量只需要aload_x一條指令;而取域成員對象的話,需要aload_0[this],getfield兩條指令.且每次從棧里取值,應該還有緩存上的好處.
查看完整回答
反對 回復 2019-04-13
  • 2 回答
  • 0 關注
  • 401 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號