咱們在工做的過程當中,常常遇到以下的需求: 用一個Map存放經常使用的Object,這個Map的併發讀取的頻率很高,而寫入的頻率很低,通常只在初始化、或從新裝裝載的時候寫入。讀寫衝突雖然不多發生,不過一旦發生,Map的內部結構就可能亂掉,因此,咱們不得不爲Map加上同步鎖。 咱們能夠採用Copy On Write的機制,來增強Map的讀取速度。 Copy On Write是這樣一種機制。當咱們讀取共享數據的時候,直接讀取,不須要同步。當咱們修改數據的時候,咱們就把當前數據Copy一份副本,而後在這個副本上進行修改,完成以後,再用修改後的副本,替換掉原來的數據。這種方法就叫作Copy On Write。 Oracle等關係數據庫的數據修改就採用Copy On Write的模式。Copy On Write模式對併發讀取的支持很好,可是在併發修改的時候,會有版本衝突的問題。可能有多個線程同時修改同一份數據,那麼就同時存在多個修改副本,這多個修改副本可能會相互覆蓋,致使修改丟失。所以,Oracle等數據庫一般會引入版本檢查機制。即增長一個版本號字段,來檢測是否存在併發修改。類似的版本控制機制存在於CVS、SVN等版本控制工具中。 在咱們的Copy On Write Map中,咱們只須要讓新數據覆蓋舊數據就能夠了,所以不須要考慮版本控制的問題。這就大大簡化了咱們的實現。 基本思路就是讓讀和寫操做分別在不一樣的Map上進行,每次寫完以後,再把兩個Map同步。代碼以下: Java代碼