在并發(fā)編程過程中,我們大部分的焦點(diǎn)都放在如何控制共享變量的訪問控制上(代碼層面),但是很少人會(huì)關(guān)注系統(tǒng)硬件及 JVM 底層相關(guān)的影響因素。前段時(shí)間學(xué)習(xí)了一個(gè)牛X的高性能異步處理框架 Disruptor,它被譽(yù)為“最快的消息框架”,其 LMAX 架構(gòu)能夠在一個(gè)線程里每秒處理 6百萬 訂單!在講到 Disruptor 為什么這么快時(shí),接觸到了一個(gè)概念——偽共享( false sharing ),其中提到:緩存行上的寫競爭是運(yùn)行在 SMP 系統(tǒng)中并行線程實(shí)現(xiàn)可伸縮性最重要的限制因素。由于從代碼中很難看出是否會(huì)出現(xiàn)偽共享,有人將其描述成無聲的性能殺手。
本文僅針對(duì)目前所學(xué)進(jìn)行合并整理,目前并無非常深入地研究和實(shí)踐,希望對(duì)大家從零開始理解偽共享提供一些幫助。
偽共享的非標(biāo)準(zhǔn)定義為:緩存系統(tǒng)中是以緩存行(cache line)為單位存儲(chǔ)的,當(dāng)多線程修改互相獨(dú)立的變量時(shí),如果這些變量共享同一個(gè)緩存行,就會(huì)無意中影響彼此的性能,這就是偽共享。
下面我們就來詳細(xì)剖析偽共享產(chǎn)生的前因后果。首先,我們要了解什么是緩存系統(tǒng)。