欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于多線程并發(fā)的常見問題(詳解)

 更新時間:2017年10月09日 10:42:43   投稿:jingxian  
下面小編就為大家?guī)硪黄诙嗑€程并發(fā)的常見問題(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一 概述

1.volatile

保證共享數(shù)據(jù)一旦被修改就會立即同步到共享內(nèi)存(堆或者方法區(qū))中。

2.線程訪問堆中數(shù)據(jù)的過程

線程在棧中建立一個數(shù)據(jù)的副本,修改完畢后將數(shù)據(jù)同步到堆中。

3.指令重排

為了提高執(zhí)行效率,CPU會將沒有依賴關(guān)系的指令重新排序。如果希望控制重新排序,可以使用volatile修飾一個變量,包含該變量的指令前后的指令各自獨(dú)立排序,前后指令不能交叉排序。

二 常見問題及應(yīng)對

1.原子性問題

所謂原子性,指的是一個操作不可中斷,即在多線程并發(fā)的環(huán)境下,一個操作一旦開始,就會在同一個CPU時間片內(nèi)執(zhí)行完畢。如果同一個線程的多個操作在不同的CPU時間片上執(zhí)行,由于中間出現(xiàn)停滯,后面的操作在執(zhí)行時可能某個共享數(shù)據(jù)被其他線程修改,而該修改并未同步到當(dāng)前線程中,導(dǎo)致當(dāng)前線程操作的數(shù)據(jù)與實(shí)際不符,這種由于執(zhí)行不連貫導(dǎo)致的數(shù)據(jù)不一致問題被稱作原子性問題。

2.可見性問題

可見性問題的出現(xiàn)與線程訪問共享數(shù)據(jù)的方式有關(guān)。線程訪問堆(方法區(qū))中的變量時,先在棧中建立一個變量的副本,修改后再同步到堆中。如果一個線程剛建立副本,這時另一線程修改了變量,尚未同步到堆中,這時就會出現(xiàn)兩個線程操作同一變量的同一種狀態(tài)的現(xiàn)象,比如i=9,變量i的初始值為9,每一個線程的操作都是減1。兩個線程A與B同時訪問變量,B先執(zhí)行i-1,在將結(jié)果i=8同步到堆中前,A線程也執(zhí)行i-1,這時i=9的狀態(tài)就被執(zhí)行兩次,出現(xiàn)線程安全問題。

線程安全問題產(chǎn)生的原因:一個線程對共享數(shù)據(jù)的修改不能立即為其他線程所見。

volatile提供了一種解決方案:

一旦一個線程修改了被volatile修飾的共享數(shù)據(jù),這種修改就會立即同步到堆中,這樣其他數(shù)據(jù)從堆中訪問共享數(shù)據(jù)時始終獲得的是在多個線程中的最新值。

volatile的缺陷:

volatile只能保證一個線程從堆中獲取數(shù)據(jù)時獲取的是當(dāng)前所有線程中的最新值,假如一個線程已經(jīng)從堆中復(fù)制了數(shù)據(jù),在操作完成前,其他線程修改了數(shù)據(jù),修改后的數(shù)據(jù)并不會同步到當(dāng)前線程中。

3.有序性問題

為了提高執(zhí)行效率,CPU會對那些沒有依賴關(guān)系的指令重新排序,重新排序后的執(zhí)行結(jié)果與順序執(zhí)行結(jié)果相同。

例如,在源代碼中:

int i=0;
int y=1;

CPU在執(zhí)行時可能先執(zhí)行“int y=1;”,接著執(zhí)行“int i=0;”,執(zhí)行結(jié)果與順序執(zhí)行結(jié)果相同。

指令重排在單線程環(huán)境下是安全的,在多線程環(huán)境下就可能出現(xiàn)問題。比如:

線程A:

s=new String("sssss");//指令1
flag=false;//

指令2線程B:

while(flag){
doSome();
}

s.toUpperCase();//指令3如果線程A順序執(zhí)行,即執(zhí)行指令1,再執(zhí)行指令2,線程B的執(zhí)行不會出現(xiàn)問題。指令重排后,假如線程A先執(zhí)行指令2,這時flag=true,切換到線程2,終止循環(huán),執(zhí)行指令3,由于s對象尚未創(chuàng)建就會出現(xiàn)空指針異常。

有序性問題產(chǎn)生的原因:

一個線程對其他線程對共享數(shù)據(jù)的修改操作有順序要求,比如線程B要求線程A先執(zhí)行指令1,再執(zhí)行指令2,由于指令重排,實(shí)際并未按照要求的順序執(zhí)行,這時就出現(xiàn)了線程安全問題。

解決思路:

1.利用同步機(jī)制,使得同一時間只有一個線程可以訪問共享數(shù)據(jù),效率低。

2.使用volatile,一個指令包含volatile修飾的變量,那么這條指令的執(zhí)行順序不變,該指令前后的指令可以各自獨(dú)立重排,無法交叉重排。

以上這篇基于多線程并發(fā)的常見問題(詳解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 講解ssm框架整合(最通俗易懂)

    講解ssm框架整合(最通俗易懂)

    這篇文章主要介紹了講解ssm框架整合(最通俗易懂),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java中Mybatis,SpringMVC,Spring的介紹及聯(lián)系

    Java中Mybatis,SpringMVC,Spring的介紹及聯(lián)系

    這篇文章主要為大家詳細(xì)介紹了Java中Mybatis,SpringMVC,Spring的介紹及聯(lián)系,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • JAVA錯誤類結(jié)果類和分頁結(jié)果類代碼詳解

    JAVA錯誤類結(jié)果類和分頁結(jié)果類代碼詳解

    這篇文章主要介紹了JAVA錯誤類結(jié)果類和分頁結(jié)果類代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • idea手動執(zhí)行maven命令的三種實(shí)現(xiàn)方式

    idea手動執(zhí)行maven命令的三種實(shí)現(xiàn)方式

    這篇文章主要介紹了idea手動執(zhí)行maven命令的三種實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • JAXB簡介_動力節(jié)點(diǎn)Java學(xué)院整理

    JAXB簡介_動力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了JAXB簡介的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java 批量刪除html中注釋內(nèi)容的方法

    Java 批量刪除html中注釋內(nèi)容的方法

    最近項目中有一個功能需要讀取外部html文本文件。但是有的html文件里面有大量的注釋,需要刪除其中的注釋在存儲
    2014-04-04
  • 解決Spring導(dǎo)出可以運(yùn)行的jar包問題

    解決Spring導(dǎo)出可以運(yùn)行的jar包問題

    最近需要解決Maven項目導(dǎo)入可執(zhí)行的jar包的問題,如果項目不包含Spring,那么使用mvn assembly:assembly即可,這篇文章主要介紹了Spring導(dǎo)出可以運(yùn)行的jar包,需要的朋友可以參考下
    2023-03-03
  • 基于Java實(shí)現(xiàn)Actor模型

    基于Java實(shí)現(xiàn)Actor模型

    Actor模型是一種常見的并發(fā)模型,與最常見的并發(fā)模型—共享內(nèi)存(同步鎖)不同,它將程序分為許多獨(dú)立的計算單元—Actor,文中有詳細(xì)的代碼示例,感興趣的同學(xué)可以參考閱讀
    2023-05-05
  • 基于JavaMail的Java郵件發(fā)送

    基于JavaMail的Java郵件發(fā)送

    電子郵件的應(yīng)用非常廣泛,例如在某網(wǎng)站注冊了一個賬戶,自動發(fā)送一封歡迎郵件,通過郵件找回密碼,自動批量發(fā)送活動信息等。本文將簡單介紹如何通過 Java 代碼來創(chuàng)建電子郵件,并連接郵件服務(wù)器發(fā)送郵件
    2021-10-10
  • Java中自定義LRU緩存詳解

    Java中自定義LRU緩存詳解

    這篇文章主要介紹了Java中自定義LRU緩存詳解,基于LRU算法的緩存系統(tǒng),可以在達(dá)到緩存容量上限時,清理最近最少使用的數(shù)據(jù),為新的數(shù)據(jù)的插入騰出空間,需要的朋友可以參考下
    2023-09-09

最新評論