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