亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

并發編程三要素是什么

發布時間:2021-06-23 09:56:42 來源:億速云 閱讀:168 作者:chen 欄目:大數據

本篇內容主要講解“并發編程三要素是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“并發編程三要素是什么”吧!

并發編程三要素
  1. **原子性:**一個不可再被分割的顆粒。原子性指的是一個或多個操作要么全部執行成功要么全部執行失敗。

  2. 有序性: 程序執行的順序按照代碼的先后順序執行。(處理器可能會對指令進行重排序)

  3. 可見性: 一個縣城對共享變量的修改,另一個線程能夠立刻看到。

一、原子性

線程切換會帶來原子性的問題

int i = 1; // 原子操作
i++; // 非原子操作,從主內存讀取 i 到線程工作內存,進行 +1,再把 i 寫到主內存。

雖然讀取和寫入都是原子操作,但合起來就不屬于原子操作,我們又叫這種為“復合操作”。

我們可以用synchronized 或 Lock 來把這個復合操作“變成”原子操作。

例子:

//使用synchronized
private synchronized void increase(){
   i++;
 }
//使用Lock
private int i = 0;
 Lock mLock = new ReentrantLock();
 
 private void increase() {
   mLock.lock();
   try {
     i++;
   } finally{
     mLock.unlock();
   }
 }

這樣我們就可以把這個一個方法看做一個整體,一個不可分割的整體。

除此之前,我們還可以用java.util.concurrent.atomic里的原子變量類,可以確保所有對計數器狀態訪問的操作都是原子的。

例子:

  AtomicInteger mAtomicInteger = new AtomicInteger(0);  
  private void increase(){
    mAtomicInteger.incrementAndGet();
  }
二、可見性

緩存導致可見性問題

并發編程三要素是什么

int v = 0;
// 線程 A 執行
v++; 
// 線程 B 執行
System.out.print("v=" + v);

即使是在執行完線程里的 i++ 后再執行線程 B,線程 B 的輸入結果也會有 2 個種情況,一個是 0 和1。

因為 i++ 在線程 A(CPU-1)中做完了運算,并沒有立刻更新到主內存當中,而線程B(CPU-2)就去主內存當中讀取并打印,此時打印的就是 0。

禁用緩存能保證可見性,volatile關鍵字可以禁用緩存

synchronized和Lock能夠保證可見性。

三、有序性

導致有序性的原因是編譯優化

我們都知道處理器為了擁有更好的運算效率,會自動優化、排序執行我們寫的代碼,但會確保執行結果不變。

例子:

int a = 0; // 語句 1
int b = 0; // 語句 2
i++; // 語句 3
b++; // 語句 4

這一段代碼的執行順序很有可能不是按上面的 1、2、3、4 來依次執行,因為 1 和 2 沒有數據依賴,3 和 4 沒有數據依賴, 2、1、4、3 這樣來執行可以嗎?完全沒問題,處理器會自動幫我們排序。

在單線程看來并沒有什么問題,但在多線程則很容易出現問題。

再來個例子:

// 線程 1
init();
inited = true;
 
// 線程 2
while(inited){
    work();
}

init(); 與 inited = true; 并沒有數據的依賴,在單線程看來,如果把兩句的代碼調換好像也不會出現問題。

但此時處于一個多線程的環境,而處理器真的把這兩句代碼重新排序,那問題就出現了,若線程 1 先執行 inited = true; 此時,init() 并沒有執行,線程 2 就已經開始調用 work() 方法,此時很可能造成一些奔潰或其他 BUG 的出現。

synchronized和Lock能確保原子性,能讓多線程執行代碼的時候依次按順序執行,自然就具有有序性。

而volatile關鍵字也可以解決這個問題,volatile 關鍵字可以保證有序性,讓處理器不會把這行代碼進行優化排序。

到此,相信大家對“并發編程三要素是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

根河市| 施秉县| 平利县| 蒲城县| 新乐市| 甘肃省| 洛川县| 金川县| 闽侯县| 阳山县| 隆尧县| 瑞金市| 壤塘县| 美姑县| 大姚县| 双鸭山市| 尚志市| 晋州市| 邢台市| 苗栗县| 香格里拉县| 梨树县| 黄山市| 普兰县| 白朗县| 江陵县| 花莲县| 五河县| 河北区| 绩溪县| 石景山区| 天祝| 东兰县| 双峰县| 勃利县| 泽州县| 夏河县| 绥宁县| 洪洞县| 成武县| 小金县|