日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

深入理解并發編程中的三個問題

來源: 責編: 時間:2024-03-19 17:35:13 257觀看
導讀1.可見性可見性(Visibility):是指一個線程對共享變量進行修改,另一個先立即得到修改后的最新值。1.1 可見性案例演示一個線程根據boolean類型的標記flag, while循環,另一個線程改變這個flag變量的值,另 一個線程并不會停止循

1.可見性

可見性(Visibility):是指一個線程對共享變量進行修改,另一個先立即得到修改后的最新值。BF828資訊網——每日最新資訊28at.com

1.1 可見性案例演示

一個線程根據boolean類型的標記flag, while循環,另一個線程改變這個flag變量的值,另 一個線程并不會停止循環。BF828資訊網——每日最新資訊28at.com

public class VisibilityTest {    // 多個線程都會訪問的數據,我們稱為線程的共享數據    // 定義一個靜態的 boolean 變量 run,初始值為 true    private static boolean run = true;     public static void main(String[] args) throws InterruptedException {        // 創建并啟動線程 t1        Thread t1 = new Thread(() -> {            // 在 run 變量為 true 時循環輸出消息            while (run) {                System.out.println(Thread.currentThread().getName() + "線程1 run = " + run);            }            // 循環結束后輸出最終消息            System.out.println(Thread.currentThread().getName() + "線程1 run = " + run);        });        t1.start(); // 啟動線程 t1        Thread.sleep(1000); // 主線程睡眠1秒鐘        // 創建并啟動線程 t2        Thread t2 = new Thread(() -> {            run = false; // 將 run 變量設置為 false            System.out.println(Thread.currentThread().getName() + "時間到,線程2設置為false");        });        t2.start(); // 啟動線程 t2    }}

輸出結果:BF828資訊網——每日最新資訊28at.com

Thread-0線程1 run = trueThread-0線程1 run = true// .....結果省略Thread-1時間到,線程2設置為falseThread-0線程1 run = false

線程1開始運行時run=true,所以會不斷循環輸出Thread-0線程1 run = true,線程2運行后設置run=false,線程1發現run=true后就停止輸出。BF828資訊網——每日最新資訊28at.com

總結:并發編程時,會出現可見性問題,當一個線程對共享變量進行了修改,另外的線程并沒有立即看到修改后的最新值。BF828資訊網——每日最新資訊28at.com

2.原子性

原子性(Atomicity):在一次或多次操作中,要么所有的操作都執行并且不會受其他因素干擾而中斷,要么所有的操作都不執行。BF828資訊網——每日最新資訊28at.com

2.1 可見性案例演示

5個線程各執行1000次 i++BF828資訊網——每日最新資訊28at.com

public class AtomicityTest {    private static int number = 0; // 定義一個靜態的整數變量 number,初始值為 0    public static void main(String[] args) throws InterruptedException {        Runnable increment = () -> {            // 定義一個 Runnable 匿名類 increment,用于對 number 進行累加操作            for (int i = 0; i < 1000; i++) {                number++; // 對 number 進行累加操作            }        };        ArrayList<Thread> ts = new ArrayList<>(); // 創建一個 ArrayList 用于存儲線程對象        for (int i = 0; i < 5; i++) {            Thread t = new Thread(increment); // 創建一個新線程,傳入 increment Runnable 實例            t.start(); // 啟動線程            ts.add(t); // 將線程對象添加到 ArrayList 中        }        for (Thread t : ts) {            t.join(); // 等待所有子線程執行完畢        }        System.out.println("number = " + number); // 輸出最終的 number 值    }}

思考:最終number結果可能是多少?BF828資訊網——每日最新資訊28at.com

結果可能是5000,也可能是小于5000的結果都有可能。BF828資訊網——每日最新資訊28at.com

對于 number++ 而言(number 為靜態變量),實際會產生如下的 JVM 字節碼指令:BF828資訊網——每日最新資訊28at.com

9: getstatic #12 // Field number:I12: iconst_113: iadd14: putstatic #12 // Field number:I

可見number++是由多條語句組成,以上多條指令在一個線程的情況下是不會出問題的,但是在多線程情況下就可能會出現問題。比如一個線程在執行13: iadd時,另一個線程又執行9: getstatic。會導致兩次number++,實際上只加了1。BF828資訊網——每日最新資訊28at.com

總結:并發編程時,會出現原子性問題,當一個線程對共享變量操作到一半時,另外的線程也有可能來操作共享變量,干擾了前一個線程的操作。BF828資訊網——每日最新資訊28at.com

3.有序性

有序性(Ordering):是指程序中代碼的執行順序,Java在編譯時和運行時會對代碼進行優化,會導致程序最終的執行順序不一定就是我們編寫代碼時的順序。BF828資訊網——每日最新資訊28at.com

3.1.  有序性可見性案例演示

有序性BF828資訊網——每日最新資訊28at.com

jcstress是Java并發壓測工具。BF828資訊網——每日最新資訊28at.com

pom文件,添加依賴。BF828資訊網——每日最新資訊28at.com

<dependency>    <groupId>org.openjdk.jcstress</groupId>    <artifactId>jcstress-core</artifactId>    <version>0.5</version></dependency>

代碼:BF828資訊網——每日最新資訊28at.com

@JCStressTest@Outcome(id = {"1", "4"}, expect = Expect.ACCEPTABLE, desc = "ok")@Outcome(id = "0", expect = Expect.ACCEPTABLE_INTERESTING, desc = "danger")@Statepublic class OrderingTest {   int num = 0;   boolean ready = false;   // 線程1執行的代碼    @Actor   public void actor1(I_Result r) {       if (ready) {           r.r1 = num + num;       } else {           r.r1 = 1;       }   }   // 線程2執行的代碼    @Actor   public void actor2(I_Result r) {       num = 2;       ready = true;   }}

I_Result 是一個對象,有一個屬性 r1 用來保存結果。BF828資訊網——每日最新資訊28at.com

思考:在多線程情況下可能出現幾種結果?BF828資訊網——每日最新資訊28at.com

  • 情況1:線程1先執行actor1,這時ready = false,所以進入else分支結果為1。
  • 情況2:線程2執行到actor2,執行了num = 2;和ready = true,線程1執行,這回進入 if 分支,結果為 4。
  • 情況3:線程2先執行actor2,只執行num = 2;但沒來得及執行 ready = true,線程1執行,還是進入else分支,結果為1。

注意:還有第四種情況,結果為0。BF828資訊網——每日最新資訊28at.com

  • 情況4:線程2java編譯后結果
ready = true;num = 2;

線程2先執行actor2,執行了ready = true,但沒來得及執行執行num = 2,線程1執行,還是進入if分支,結果為0。BF828資訊網——每日最新資訊28at.com

BF828資訊網——每日最新資訊28at.com

運行測試:BF828資訊網——每日最新資訊28at.com

mvn clean installjava -jar target/jcstress.jar

部分jcstress測試結果,0結果出現1384次。BF828資訊網——每日最新資訊28at.com

BF828資訊網——每日最新資訊28at.com

完整pox.xml:BF828資訊網——每日最新資訊28at.com

<properties>        <maven.compiler.source>8</maven.compiler.source>        <maven.compiler.target>8</maven.compiler.target>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <javac.target>1.8</javac.target>        <uberjar.name>jcstress</uberjar.name>    </properties>    <dependencies>        <dependency>            <groupId>org.openjdk.jcstress</groupId>            <artifactId>jcstress-core</artifactId>            <version>0.5</version>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-compiler-plugin</artifactId>                <version>3.1</version>                <configuration>                    <compilerVersion>${javac.target}</compilerVersion>                    <source>${javac.target}</source>                    <target>${javac.target}</target>                </configuration>            </plugin>            <plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-shade-plugin</artifactId>                <version>2.2</version>                <executions>                    <execution>                        <id>main</id>                        <phase>package</phase>                        <goals>                            <goal>shade</goal>                        </goals>                        <configuration>                            <finalName>${uberjar.name}</finalName>                            <transformers>                                <transformer                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">                                    <mainClass>org.openjdk.jcstress.Main</mainClass>                                </transformer>                                <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">                                    <resource>META-INF/TestList</resource>                                </transformer>                            </transformers>                        </configuration>                    </execution>                </executions>            </plugin>        </plugins>    </build>


BF828資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-77831-0.html深入理解并發編程中的三個問題

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 在 Go 中如何停止程序

下一篇: 構建一個通用靈活的JavaScript插件系統?看完你也會!

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久久久一区| 欧美一站二站| 最新日韩在线| 午夜精品久久久久| 欧美va亚洲va国产综合| 国产精品免费一区豆花| 欧美电影免费| 国产日本欧洲亚洲| 亚洲国产婷婷香蕉久久久久久| 99在线精品观看| 久久精品国产欧美激情| 裸体一区二区三区| 欧美成人午夜| 国产精品美女午夜av| 亚洲茄子视频| 久久精品国产亚洲5555| 欧美深夜影院| 夜夜嗨av一区二区三区| 欧美日本韩国在线| 国产精品mm| 激情久久久久久| 日韩午夜在线视频| 香港成人在线视频| 欧美freesex8一10精品| 国产精品拍天天在线| 亚洲国产一区在线观看| 亚洲自拍偷拍网址| 免费人成网站在线观看欧美高清| 欧美午夜电影网| 国产精品福利久久久| 欧美亚洲一区二区在线观看| 国产精品成人一区二区| 欧美一级二区| 欧美日韩一区在线播放| 亚洲一区二区视频| 欧美在线视频一区二区三区| 国内精品**久久毛片app| 久久精品国产99国产精品澳门| 亚洲福利国产| 国产手机视频一区二区| 欧美日韩二区三区| 美女999久久久精品视频| 宅男噜噜噜66一区二区66| 激情久久久久久| 亚洲国产精品精华液2区45| 亚洲一区三区在线观看| 牛牛国产精品| 国产亚洲一本大道中文在线| 亚洲婷婷综合色高清在线| 欧美成人久久| 激情综合色丁香一区二区| 亚洲欧美一区二区三区极速播放| 欧美日韩成人| 亚洲欧洲精品一区| 久久三级福利| 精品动漫3d一区二区三区| 欧美一区二区私人影院日本| 国产精品久久久久国产a级| 亚洲精品资源| 欧美成人自拍视频| 亚洲电影下载| 久久综合影音| 在线观看日韩国产| 久久在线播放| 狠狠色香婷婷久久亚洲精品| 欧美一区二区三区四区视频| 国产精品日韩欧美一区二区| 亚洲视频一二区| 欧美日韩午夜| 一本色道久久加勒比88综合| 欧美日韩1080p| 日韩视频一区二区| 欧美日本亚洲| 一本大道av伊人久久综合| 欧美日韩大片| 国产精品99久久久久久白浆小说| 欧美日韩免费区域视频在线观看| 日韩视频一区二区三区在线播放免费观看| 美日韩免费视频| 亚洲激情啪啪| 欧美精品 国产精品| 亚洲毛片网站| 欧美日韩一区不卡| 亚洲天堂av图片| 国产精品激情电影| 亚洲欧美国产高清va在线播| 国产精品爽黄69| 欧美一区二区三区成人| 国产亚洲第一区| 久久久爽爽爽美女图片| 尤物在线观看一区| 欧美a级一区| 99成人在线| 国产精品国色综合久久| 午夜日韩视频| 好看的亚洲午夜视频在线| 蜜臀久久99精品久久久久久9 | 亚洲人永久免费| 欧美激情五月| 亚洲视频1区2区| 国产伦精品一区二区三区视频孕妇| 欧美一区亚洲一区| 一区免费观看视频| 欧美国产视频一区二区| 一区二区三区日韩在线观看| 国产精品一二三视频| 久久久久久久一区二区| 91久久在线视频| 国产精品爱久久久久久久| 欧美在线啊v一区| 曰本成人黄色| 欧美日韩国产色综合一二三四| 亚洲一区免费| 国色天香一区二区| 欧美激情中文字幕一区二区| 亚洲一区二区三区久久| 国产亚洲成人一区| 欧美成人精品影院| 一区二区三区四区五区在线| 国产欧美日韩精品一区| 媚黑女一区二区| 在线一区欧美| 国语自产精品视频在线看抢先版结局| 欧美成人午夜激情视频| 亚洲午夜在线视频| 精品成人一区二区三区四区| 欧美日韩三级电影在线| 欧美一区二区三区在线看| 亚洲国产一区视频| 国产精品视频一区二区三区| 麻豆精品一区二区综合av| 国产精品99久久久久久人| 国产综合色精品一区二区三区| 欧美高清在线精品一区| 亚洲欧美大片| 亚洲激情偷拍| 国产日韩在线看片| 欧美精品一级| 久久精品国语| 中国女人久久久| 黄色日韩网站| 国产精品久久久久毛片软件| 蜜桃精品久久久久久久免费影院| 亚洲一区亚洲二区| 亚洲东热激情| 国产日韩欧美成人| 欧美乱妇高清无乱码| 久久久www成人免费无遮挡大片| 一本大道av伊人久久综合| 国内久久精品视频| 国产精品久久久久久久电影 | 欧美另类一区二区三区| 久久久久成人精品免费播放动漫| 99国产精品久久久久久久久久 | 在线亚洲欧美视频| 亚洲国产精品精华液网站| 国产日韩欧美精品综合| 欧美日韩中文在线| 免费欧美视频| 久久国产日韩欧美| 亚洲在线不卡| 99视频精品在线| 亚洲国产欧美国产综合一区| 国产亚洲精品久久飘花| 国产精品二区二区三区| 欧美激情视频一区二区三区在线播放| 欧美专区在线观看| 亚洲伊人伊色伊影伊综合网| 亚洲伦理中文字幕| 亚洲激情成人| 激情欧美亚洲| 国产亚洲激情| 国产精品系列在线播放| 欧美视频一二三区| 欧美久久99| 欧美成人精品三级在线观看| 久久人人97超碰国产公开结果| 午夜精品亚洲| 亚洲伊人伊色伊影伊综合网| 99精品久久久| 亚洲理伦电影| 亚洲日本中文| 亚洲精品国产精品久久清纯直播 | 亚洲电影免费| 在线观看91精品国产入口| 国产综合激情| 国产一区二区三区网站| 国产日韩三区| 国产日韩欧美亚洲一区| 国产精品一区二区男女羞羞无遮挡| 欧美色一级片| 欧美日韩中文字幕精品| 欧美日韩理论| 欧美日韩亚洲免费| 欧美日韩在线精品| 欧美视频在线观看视频极品| 欧美日韩一二三四五区| 欧美日韩在线视频一区| 欧美日韩一区成人| 欧美视频一区在线观看| 国产精品v片在线观看不卡| 国产精品v亚洲精品v日韩精品| 欧美少妇一区| 国产精品入口|