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