原子性:是指乙個操作是不可中斷的。即使是多個執行緒一起執行的時候,乙個操作一旦開始,就不會被其他執行緒干擾。
比如,對於乙個靜態全域性變數int i,兩個執行緒同時對它賦值,執行緒a給他賦值為1,執行緒b給他賦值為-1。那麼不管這兩個執行緒
以何種方式。何種步調工作,i的值要麼是1,要麼是-1.執行緒a和執行緒b之間是沒有干擾的。這就是原子性的乙個特點,不可被中斷。
可見性:是指當乙個執行緒修改了某乙個共享變數的值,其他執行緒是否能夠立即知道這個修改。顯然,對於序列來說,可見性問題是不存在的。
有序性:在併發時,程式的執行可能會出現亂序。給人的直觀感覺就是:寫在前面的**,會在後面執行。有序性問題的原因是因為程式在
執行時,可能會進行指令重排,重排後的指令與原指令的順序未必一致。
執行緒的原子性與可見性
同步最基本的目的是保證原子性。另乙個容易忽略的目的是可見性,即乙個執行緒修改的共享資料對另乙個執行緒可見。因為一些基本型別的賦值操作本身是原子的。所以針對這些賦值操作在不使用synchronized的情況下,可以使用volatile來解決乙個執行緒的修改對另乙個執行緒的可見。所以volatile是在...
多執行緒學習一 可見性 原子性和有序性
在單核時代,所有的快取都操作同乙個cup上的快取,所以可見性很容易解決。當a執行緒更新了快取上的變數,那麼在b執行緒去訪問該變數的時候,拿到的一定是最新值。在多核時代,每個cup都有自己的快取區,當不同cup上的執行緒去訪問記憶體中的同個變數時,假設該變數在cup中都有快取。那麼不同cup上的執行緒...
併發程式設計中的三個概念 原子性,可見性,有序性
在併發程式設計中,我們通常會遇到以下三個問題 原子性問題,可見性問題,有序性問題。我們先看具體看一下這三個概念 1.原子性 原子性 即乙個操作或者多個操作 要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。乙個很經典的例子就是銀行賬戶轉賬問題 比如從賬戶a向賬戶b轉1000元,那麼必然包...