對于涉及共享變量訪問的操作,若該操作從其執(zhí)行線程以外的任意線程來看是不可分割的,那么該操作就是原子操作,稱該操作具有原子性
實現(xiàn)原子性的兩種方式:
- 使用鎖(Lock)
- 利用CAS(Compare and Swap) 直接在硬件(處理器、內存)這一層次實現(xiàn),又被稱為“硬件鎖”
在Java中,對基礎數(shù)據(jù)類型(除double、long以外)的變量和引用變量的寫操作都是原子性的
Java中的double、long類型變量會占用64位(8字節(jié))的存儲空間,32位的Java虛擬機對這種變量的寫操作可能會分解為兩個步驟實施,比如先寫低32位,后寫高32位,故不能保證原子性
Java中對任何變量的讀操作都是原子性的
Java語言規(guī)范特別地規(guī)定對于volatile關鍵字修飾的long/double類型變量的寫操作是具有原子性的
可以使用synchronized關鍵字來保證操作的原子性
原子操作 + 原子操作 != 原子操作