Udemy Course Multithreading, Concurrency & Performance 16
由前節可知要簡單限定Atomic Operation只要簡單加入修飾字synchronized
但是加入過多的synchronized修飾字會導致Multithread在同一時間內
無法同時處理synchronized修飾的邏輯演算(Atomic Operation)
甚至許多threads可能都在排隊進到Atomic Operation,意味著
花費更多的context switch,及memory overhead
所以要盡可能地減小synchronized鎖定的範圍
但是除了我們主動加入修飾字synchronized外
其實Java也有些演算本身就是Atomic Operation
(不過不是全部都是Atomic Operation)
哪些Java Code本身就是Atomic Operation?
1.所有的reference assignments都是Atomic
EX:
Object a = new Object();
Object b= new Object();
a = b; //←這個是Atomic
即一般Java bean裡面的getter setter都是Atomic,不用另加synchronized
(不管是一般變數還是array的getter setter都是!)
2.讀寫原始型別是Atomic(除了long/double),如以下
int
short
byte
float
char
boolean
而long與double因為是64bits,如下例
long x = 5;
long y = 10;
x = y;//這個過程可能會有兩步,先做低位的32bits後再做高位32bits賦值
但是Java針對這兩個型別有特別的解法(加入volatile修飾字) EX:
volatile double x =1.0;
volatile double y=9.0;
x = y;//這是Atomic
3.Java本身有些class(如java.util.concurrent.atomic)是Atomic
後面會在介紹這些class