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

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

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

一、原子性

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

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

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

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

例子:

 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里的原子變量類,可以確保所有對計數(shù)器狀態(tài)訪問的操作都是原子的。

例子:

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

二、可見性

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

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

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

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

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

synchronized和Lock能夠保證可見性。

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

三、有序性

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

例子:

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

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

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

再來個例子:

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

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

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

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

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

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

相關(guān)文章

  • 分析Java設(shè)計模式之組合模式

    分析Java設(shè)計模式之組合模式

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

    Java 異常的知識整理

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

    Java中的synchronized關(guān)鍵字

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

    java參數(shù)傳值代碼舉例

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

    springboot整合flowable框架入門步驟

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

    MybatisPlus出現(xiàn)Error attempting to get col

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

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

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

    Java手寫Redis服務(wù)端的實現(xiàn)

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

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

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

    Java設(shè)計模式之責(zé)任鏈模式的示例詳解

    責(zé)任鏈模式是將鏈中的每一個節(jié)點看做是一個對象,每個節(jié)點處理的請求均不相同,且內(nèi)部自動維護(hù)下一個節(jié)點對象,當(dāng)一個請求從鏈?zhǔn)降氖锥伟l(fā)出時,會沿著鏈的路徑依次傳遞給每一個節(jié)點對象。本文將通過示例和大家詳細(xì)聊聊責(zé)任鏈模式,需要的可以參考一下
    2022-11-11

最新評論

萨嘎县| 周宁县| 高淳县| 光泽县| 兰州市| 喜德县| 定边县| 乌拉特后旗| 宿松县| 汾阳市| 定南县| 怀远县| 仪征市| 涟水县| 抚松县| 盐山县| 青铜峡市| 时尚| 新宁县| 龙南县| 贵南县| 出国| 大安市| 岳阳县| 积石山| 芒康县| 盐池县| 福州市| 洛阳市| 灯塔市| 莱芜市| 延川县| 贡觉县| 闽侯县| 建德市| 长宁区| 延安市| 璧山县| 淮安市| 青海省| 齐河县|