Thread --三大特性 原子性,可見性,有序性

原子性、可見性有序java

什麼是原子性

即一個操做或者多個操做 要麼所有執行而且執行的過程不會被任何因素打斷,要麼就都不執行。編程

一個很經典的例子就是銀行帳戶轉帳問題:
好比從帳戶A向帳戶B轉1000元,那麼必然包括2個操做:從帳戶A減去1000元,往帳戶B加上1000元。這2個操做必需要具有原子性才能保證不出現一些意外的問題。安全

咱們操做數據也是如此,好比i = i+1;其中就包括,讀取i的值,計算i,寫入i。這行代碼在Java中是不具有原子性的,則多線程運行確定會出問題,因此也須要咱們使用同步和lock這些東西來確保這個特性了。 多線程

原子性其實就是保證數據一致、線程安全一部分,優化

什麼可見性

當多個線程訪問同一個變量時,一個線程修改了這個變量的值,其餘線程可以當即看獲得修改的值。spa

若兩個線程在不一樣的cpu,那麼線程1改變了i的值還沒刷新到主存,線程2又使用了i,那麼這個i值確定仍是以前的,線程1對變量的修改線程沒看到這就是可見性問題。 .net

什麼是有序性

程序執行的順序按照代碼的前後順序執行。線程

通常來講處理器爲了提升程序運行效率,可能會對輸入代碼進行優化,它不保證程序中各個語句的執行前後順序同代碼中的順序一致,可是它會保證程序最終執行結果和代碼順序執行的結果是一致的。以下:排序

int a = 10;    //語句1get

int r = 2;    //語句2

a = a + 3;    //語句3

r = a*a;     //語句4

則由於重排序,他還可能執行順序爲 2-1-3-4,1-3-2-4
但毫不可能 2-1-4-3,由於這打破了依賴關係。
顯然重排序對單線程運行是不會有任何問題,而多線程就不必定了,因此咱們在多線程編程時就得考慮這個問題了。

相關文章
相關標籤/搜索