定義:當多個執行緒訪問某個類時,不管執行時環境採用何種排程方式或者這些程序將如何交替執行,並且在主調**中不需要任何額外的同步或協同,這個類都能表現出正確的行為,那麼就稱這個類是執行緒安全的。
原子性:提供互斥訪問,在同一時刻只能有乙個執行緒對他訪問
可見性:乙個執行緒對記憶體的修改可以及時的被其他執行緒觀察到
有序性:乙個執行緒觀察其他執行緒中的指令順序,由於指令重排序的存在,觀察結果一般雜亂無序
atomic包都是通過cas理論完成執行緒的原子性atomicinteger類 ,會出現迴圈
public
class
atomicexple1
catch
(exception e)
countdownlatch.
countdown()
;});
} countdownlatch.
await()
; executorservice.
shutdown()
; log.
info
("count:{}"
, count.
get())
;}private
static
void
add(
)}
備註:為什麼表現出原子性
原始碼分析:
//var1是count的物件,var2是當前物件在記憶體的偏移量,var4 就是1(要加上的值)
public
final
intgetandaddint
(object var1,
long var2,
int var4)
while(!
this
.compareandswapint
(var1, var2, var5, var5 + var4));
return var5;
}
大量執行緒併發更新乙個原子類的時候,天然的乙個問題就是自旋,分段遷移,某乙個執行緒如果對乙個cell更新的時候,發現說出現了很難更新他的值,出現了多次自旋的乙個問題,如果他cas失敗了,自動遷移段,他會去嘗試更新別的cell的值,這樣的話就可以讓乙個執行緒不會盲目的等待乙個cell的值.
longadder原理圖:
;//最後輸出為4
}
public
class
countexample5
", countexample5.
getcount()
);//120;}if
(updater.
compareandset
(countexample5,
100,
120))"
, countexample5.
getcount()
);}else
", countexample5.
getcount()
);//120}}
}
執行緒安全性 原子性 atomic
定義 當多個執行緒訪問某個類時,不管執行時環境採用何種排程方式,或者這些程序將如何交替執行,並且在主調 中不需要任何額外的同步或協同,這個類都能表現出正確的行為,那麼就稱這個類時安全的 執行緒安全性,主要體現在三個方面,分別是 原子性 提供了互斥訪問,同一時刻只能有乙個執行緒對它進行訪問 可見性 乙...
原子性atomic與非原子性natomic
原子操作是不可分割的操作,在原子操作執行完畢之前,其不會被任何其它任務或事件中斷。在單處理器系統 uniprocessor 中,能夠在單條指令中完成的操作都可以認為是 原子操作 因為中斷只能發生於指令之間。某些cpu指令系統中引入了test and set test and clear等指令產生臨界...
執行緒安全性
定義 當多個執行緒訪問某個類時,不管執行環境採用何種呼叫方式或者這些執行緒如何交替執行,並且在主調 中不需要任何額外的同步或者協同,這個類都能表現出正確的行為,那麼就稱這個類是執行緒安全的。主要表現三個方面 atomic cas unsafe.compareandswapint atomiclong...