內(nèi)部類介紹:
ForkJoinWorkerThreadFactory: 內(nèi)部線程工廠接口,用于創(chuàng)建工作線程ForkJoinWorkerThread
DefaultForkJoinWorkerThreadFactory: ForkJoinWorkerThreadFactory 的默認(rèn)實(shí)現(xiàn)類
InnocuousForkJoinWorkerThreadFactory: 實(shí)現(xiàn)了ForkJoinWorkerThreadFactory,無許可線程工廠,當(dāng)系統(tǒng)變量中有系統(tǒng)安全管理相關(guān)屬性時(shí),默認(rèn)使用這個(gè)工廠創(chuàng)建工作線程。
EmptyTask: 內(nèi)部占位類,用于替換隊(duì)列中 join 的任務(wù)。
ManagedBlocker: 為 ForkJoinPool 中的任務(wù)提供擴(kuò)展管理并行數(shù)的接口,一般用在可能會(huì)阻塞的任務(wù)(如在 Phaser 中用于等待 phase 到下一個(gè)generation)。
WorkQueue: ForkJoinPool 的核心數(shù)據(jù)結(jié)構(gòu),本質(zhì)上是work-stealing 模式的雙端任務(wù)隊(duì)列,內(nèi)部存放 ForkJoinTask 對(duì)象任務(wù),使用 @Contented 注解修飾防止偽共享。
工作線程在運(yùn)行中產(chǎn)生新的任務(wù)(通常是因?yàn)檎{(diào)用了 fork())時(shí),此時(shí)可以把 WorkQueue 的數(shù)據(jù)結(jié)構(gòu)視為一個(gè)棧,新的任務(wù)會(huì)放入棧頂(top 位);工作線程在處理自己工作隊(duì)列的任務(wù)時(shí),按照 LIFO 的順序。 工作線程在處理自己的工作隊(duì)列同時(shí),會(huì)嘗試竊取一個(gè)任務(wù)(可能是來自于剛剛提交到 pool 的任務(wù),或是來自于其他工作線程的隊(duì)列任務(wù)),此時(shí)可以把 WorkQueue 的數(shù)據(jù)結(jié)構(gòu)視為一個(gè) FIFO 的隊(duì)列,竊取的任務(wù)位于其他線程的工作隊(duì)列的隊(duì)首(base位)。
偽共享狀態(tài): 緩存系統(tǒng)中是以緩存行(cache line)為單位存儲(chǔ)的。緩存行是2的整數(shù)冪個(gè)連續(xù)字節(jié),一般為32-256個(gè)字節(jié)。最常見的緩存行大小是64個(gè)字節(jié)。當(dāng)多線程修改互相獨(dú)立的變量時(shí),如果這些變量共享同一個(gè)緩存行,就會(huì)無意中影響彼此的性能,這就是偽共享。