DefaultPromise精彩設(shè)計點
結(jié)構(gòu)中其綁定的eventExecutor,其的監(jiān)聽futureListeners(執(zhí)行結(jié)果setSuccess/setFailure/setCancel等成功后進行通知)蛮穿,執(zhí)行結(jié)果result(其通過AtomicReferenceFieldUpdater原子cas設(shè)置其值減少鎖等待)庶骄,當(dāng)前等待的線程數(shù)waiters(調(diào)用wait或者sync的時候毁渗,等待之前+1,被喚醒后-1)践磅,死鎖檢測(在wait的時候先看當(dāng)前現(xiàn)場是否是eventloop線程)。
FutureListeners
promise中設(shè)計了一個可擴展的futureListeners灸异,其類型引用為Object府适,用于適配多種不同類型,其精髓在于通過設(shè)計達到節(jié)約內(nèi)存的目的肺樟。
如代碼檐春,a.如果listeners為空,則直接賦值么伯。b.如果其為GenericFutureListener疟暖,則創(chuàng)建一個DefaultFutureListeners實例。
c.如果其為DefaultFutureListeners田柔,則直接添加listener俐巴。 通過這種設(shè)計可以盡量節(jié)約內(nèi)存,因為一般的監(jiān)聽不會有特別多硬爆。下面我們來看看DefaultFutureListeners的設(shè)計
DefaultFutureListeners
可以看出構(gòu)造器時候欣舵,初始只構(gòu)造2個GenericFutureListener的數(shù)組(同樣的假設(shè)為了節(jié)約內(nèi)存)荆永。
當(dāng)添加listener的時候通過成倍增加宴树,并用復(fù)制函數(shù),快速添加(同樣假設(shè)監(jiān)聽器不可能有太多)