最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多線程并發(fā)編程 并發(fā)三大要素

 更新時間:2017年05月22日 22:57:42   投稿:mdxy-dxy  
這篇文章主要介紹了Java多線程并發(fā)編程 并發(fā)三大要素,需要的朋友可以參考下

一、原子性

原子,一個不可再被分割的顆粒。原子性,指的是一個或多個不能再被分割的操作。

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

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

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

例子:

 private synchronized void increase(){
    i++;
  }

 private int i = 0;
  Lock mLock = new ReentrantLock();

  private void increase() {
    mLock.lock();
    try {
      i++;
    } finally{
      mLock.unlock();
    }
  }

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

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

例子:

AtomicInteger mAtomicInteger = new AtomicInteger(0);
 
  private void increase(){
    mAtomicInteger.incrementAndGet();
  }

二、可見性

當多線程訪問某一個(同一個)變量時,其中一條線程對此變量作出修改,其他線程可以立刻讀取到最新修改后的變量。

int i = 0;
// 線程 1 執(zhí)行
i++;

// 線程 2 執(zhí)行
System.out.print("i=" + i);

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

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

synchronized和Lock能夠保證可見性。

另外volatile關鍵字也可以解決這個問題(下一篇會講到)。

三、有序性

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

例子:

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

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

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

再來個例子:

// 線程 1
init();
inited = true;

// 線程 2
while(inited){
	work();
}

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

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

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

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

相關文章

  • 分析Java設計模式之組合模式

    分析Java設計模式之組合模式

    組合模式是一種對象的行為模式。將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。它的本質是統(tǒng)一葉子對象和組合對象。它的目的是讓客戶端不再區(qū)分操作的是組合對象還是葉子對象,而是以一個統(tǒng)一的方式來操作
    2021-06-06
  • Java 異常的知識整理

    Java 異常的知識整理

    這篇文章主要介紹了Java 異常的知識整理的相關資料,需要的朋友可以參考下
    2017-07-07
  • Java中的synchronized關鍵字

    Java中的synchronized關鍵字

    這篇文章主要介紹了Java中的synchronized關鍵字,synchronized可以保證方法或代碼塊在運行時,同一時刻只有一個線程可以進入到臨界區(qū)(互斥性),同時它還保證了共享變量的內存可見性,下面我們就來看看你文章對synchronized鎖的介紹,需要的朋友也可以參考一下
    2021-12-12
  • java參數傳值代碼舉例

    java參數傳值代碼舉例

    在編程中往方法中傳遞參數的方法往往有兩種,一種是值傳遞,一種是引用傳遞,而在java中所有的參數傳遞全部都是值傳遞,這篇文章主要給大家介紹了關于java參數傳值的相關資料,需要的朋友可以參考下
    2024-03-03
  • springboot整合flowable框架入門步驟

    springboot整合flowable框架入門步驟

    最近工作中有用到工作流的開發(fā),引入了flowable工作流框架,在此記錄一下springboot整合flowable工作流框架的過程,感興趣的朋友一起看看吧
    2022-04-04
  • MybatisPlus出現Error attempting to get column ‘xxx字段‘ from result set異常解決

    MybatisPlus出現Error attempting to get col

    本文重點分析使用@EnumValue注解轉換時遇到的一下錯誤原因,及解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-11-11
  • 詳解Maven profile配置管理及激活profile的幾種方式

    詳解Maven profile配置管理及激活profile的幾種方式

    這篇文章主要介紹了詳解Maven profile配置管理及激活profile的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Java手寫Redis服務端的實現

    Java手寫Redis服務端的實現

    本文主要介紹了Java手寫Redis服務端的實現,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 實踐講解SpringBoot自定義初始化Bean+HashMap優(yōu)化策略模式

    實踐講解SpringBoot自定義初始化Bean+HashMap優(yōu)化策略模式

    本篇講解了SpringBoot自定義初始化Bean+HashMap優(yōu)化策略模式,通過實踐的方式更通俗易懂,對此不了解的同學跟著小編往下看吧
    2021-09-09
  • Java設計模式之責任鏈模式的示例詳解

    Java設計模式之責任鏈模式的示例詳解

    責任鏈模式是將鏈中的每一個節(jié)點看做是一個對象,每個節(jié)點處理的請求均不相同,且內部自動維護下一個節(jié)點對象,當一個請求從鏈式的首段發(fā)出時,會沿著鏈的路徑依次傳遞給每一個節(jié)點對象。本文將通過示例和大家詳細聊聊責任鏈模式,需要的可以參考一下
    2022-11-11

最新評論

黄陵县| 五指山市| 南川市| 高安市| 响水县| 普定县| 双柏县| 桦甸市| 太原市| 通许县| 平舆县| 旬阳县| 乌兰浩特市| 鹤庆县| 双牌县| 兰州市| 皮山县| 建始县| 正镶白旗| 收藏| 墨竹工卡县| 观塘区| 吕梁市| 普格县| 邹平县| 德兴市| 敦化市| 临泽县| 开封市| 巴林右旗| 新闻| 龙岩市| 锦州市| 邵东县| 仁怀市| 恭城| 青神县| 临泽县| 淳安县| 宁化县| 从化市|