先找L1緩存,再找L2緩存,再找L3緩存。
緩存是按塊來讀的。緩存塊的大小叫做緩存行,固定大小64字節。
緩存一致性:緩存行在其他核更新時,本緩存如何更新?
緩存行的4中狀態。英特爾CPU使用MESI緩存一致性協議。
花3s時間。
對比:
只花了1.2s。
說明:兩個值非常近時,多線程訪問速度可能低。
加入填充後,x不可能與其他變量在同一個緩存行。因此改變時不需要通知其他緩存行。
有的源碼如下:
添加了無效字段的填充。
volatile:1.線程可見性
2.禁止重排序。
cpu速度是內存的100倍。
原因是CPU會亂序執行。
DCL單例要不要加volatile。
DCL:Double Check Lock
這個單例還挺不錯的。
經典的DCL寫法。以下寫法是完美的。很多代碼都會用。
先判斷的時間非常短,比直接上鎖快很多。
注意上邊有一個volatile,必須加!!!
讀讀;寫寫;讀寫;寫讀;
1.Runnable線程沒有返回值。
2.Callable有返回值,返回值是Future。Future拿到結果需要阻塞。
3.Google的包:ListenableFuture。這個可以完美解決。
4.jdk1.8學習ListenableFuture,誕生了CompleteFuture,比ListenableFuture更叼。
中斷時需要cancel方法。