国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

《深入理解Java虛擬機:JVM高級特性與最佳實踐(第3版) 周志明》 - 第12章代碼示例

這篇具有很好參考價值的文章主要介紹了《深入理解Java虛擬機:JVM高級特性與最佳實踐(第3版) 周志明》 - 第12章代碼示例。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

背景

? ? ? ? 最近在看《深入理解Java虛擬機:JVM高級特性與最佳實踐(第3版) 周志明》這本書,書中有些代碼示例是為了讓讀者理解作者表達(dá)的意思,但不是完整的代碼示例,所以針對這些不完整的代碼,自己動手寫出完整的代碼示例。

說明

(1)在看這本書的同學(xué),可以拿我這里的示例代碼做個參考,并歡迎提出意見和建議;

(2)示例的標(biāo)號,是和書中的代碼示例標(biāo)號相對應(yīng)的。

第12章 -?代碼

示例:12-1

/**
 * 這個程序演示的是:《深入理解JVM》(周志明 第三版) 代碼清黨12-1 volatile運算
 * 
 * volatile關(guān)鍵字只能保證可見性,并不能保證原子性(和有序性)
 * 因為程序輸出的結(jié)果有不等于200000的情況發(fā)生
 */
public class VolatileTest_12_1 {


    public static volatile int race = 0;


    public static void increase() {
        race++;
    }

    private static final int THREAD_COUNT = 20;

    public static void main(String[] args) {
        Thread[] threads = new Thread[THREAD_COUNT];
        for (int i = 0; i < THREAD_COUNT; i++) {
            threads[i] = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        increase();
                    }
                }
                    
            });
            threads[i].start();
        }

        // 等待所有累加線程都結(jié)束
        for (Thread thread : threads) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        System.out.println(race);
    }
}

示例:12-1的解決方式一

/**
 * 這個程序演示的是:
 *
 * volatile關(guān)鍵字只能保證可見性,并不能保證原子性(和有序性)
 * 
 * 針對這個程序,想要保證并發(fā)執(zhí)行的結(jié)果符合預(yù)期,可以使用 synchronized關(guān)鍵字實現(xiàn)(但是這種實現(xiàn)方式是重量級的實現(xiàn),效率較低)
 */
public class VolatileTest_12_1_Solution_1 {

    public static volatile int race = 0;
    
    public static void increase() {
        race++;
    }

    private static final int THREAD_COUNT = 20;

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        Thread[] threads = new Thread[THREAD_COUNT];
        for (int i = 0; i < THREAD_COUNT; i++) {
            threads[i] = new Thread(new Runnable() {
                @Override
                public void run() {
                    synchronized (VolatileTest_12_1_Solution_1.class) {
                        for (int i = 0; i < 10000; i++) {
                            increase();
                        }
                    }

                }
            });
            threads[i].start();
        }

        // 等待所有累加線程都結(jié)束
        for (Thread thread : threads) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(race);
        long end = System.currentTimeMillis();
        System.out.println((end - start));
    }
}

示例:12-1的解決方式二

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 這個程序演示的是:
 * <p>
 * volatile關(guān)鍵字只能保證可見性,并不能保證原子性(和有序性)
 * <p>
 * 針對這個程序,想要保證并發(fā)執(zhí)行的結(jié)果符合預(yù)期,可以使用 synchronized關(guān)鍵字實現(xiàn)(但是這種實現(xiàn)方式是重量級的實現(xiàn),效率較低)
 */
public class VolatileTest_12_1_Solution_2 {

    //public static volatile int race = 0;

    //public static void increase() {
    //    race++;
    //}

    public static AtomicInteger race = new AtomicInteger(0);

    public static void increase() {
        race.incrementAndGet(); // 原子操作的方法(底層使用CAS指令實現(xiàn))
    }

    private static final int THREAD_COUNT = 20;

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        Thread[] threads = new Thread[THREAD_COUNT];
        for (int i = 0; i < THREAD_COUNT; i++) {
            threads[i] = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        increase();
                    }
                }
            });
            threads[i].start();
        }

        // 等待所有累加線程都結(jié)束
        for (Thread thread : threads) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(race);
        long end = System.currentTimeMillis();
        System.out.println((end - start));
    }
}

示例:12-3

/**
 * 
 * volatile的使用場景
 * 
 * (書中原話)
 * 而在像代碼清單12-3所示的這類場景中就很適合使用volatile變量來控制并發(fā),當(dāng)shutdown()方法被調(diào)用時,
 * 能保證所有線程中執(zhí)行的doWork()方法都立即停下來。
 */
public class VolatileTest_12_3 {

    private static final int THREADS_COUNT = 3;

    public static void main(String[] args) throws InterruptedException {

        MyTask myTask = new MyTask();
        Thread[] threads = new Thread[THREADS_COUNT];
        for (int i = 0; i < THREADS_COUNT; i++) {
            threads[i] = new Thread(myTask, "t"+(i+1));
            threads[i].start();
        }
        Thread.sleep(500);
        myTask.shutdown();
    }
}


class MyTask implements Runnable {

    private volatile boolean shutdownRequested;

    public void shutdown() {
        System.out.println(Thread.currentThread().getName()+"---->");
        shutdownRequested = true;
    }

    @Override
    public void run() {
        while (!shutdownRequested) {
            //try {
            //    Thread.sleep(500);
            //} catch (InterruptedException e) {
            //    throw new RuntimeException(e);
            //}
            System.out.println(Thread.currentThread().getName() + " --- do something...");
        }
    }
}

示例:12-4

import lombok.extern.slf4j.Slf4j;

/**
 * 需求:模擬一個A線程用來讀取配置信息,另一個B線程等待A線程把配置信息讀取完成后執(zhí)行后續(xù)任務(wù),
 * 其中線程A在讀取完成配置信息后會把一個flag標(biāo)志位由false變?yōu)閠rue, B線程讀取到這個flag標(biāo)志位為true后,才開始執(zhí)行
 */
@Slf4j
public class VolatileTest_12_4 {
    
    public static void main(String[] args) {
        
        // 創(chuàng)建配置信息對象
        Configuration configuration = new Configuration();
        
        Thread threadA = new Thread("Thread-A"){
            @Override
            public void run() {
                // 模擬讀取配置信息的耗時操作
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                // 讀取完配置信息后,將其標(biāo)志位改為true
                configuration.setConfigLoaded(true);
                log.info("Thread-A: Configuration reading completed.");          
            }
        };

        Thread threadB = new Thread("Thread-B"){
            @Override
            public void run() {
                // 等待標(biāo)志位為true
                while (!configuration.isConfigLoaded()){
                    // 在標(biāo)志位為false時,線程Thread-B什么都不做
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    log.info("no no no no...");
                }
                
                log.info("Thread-B: Start executing subsequent tasks.");
            }
        };
        
        threadA.start();
        threadB.start();
    }
}

// 配置類
class  Configuration{
    private volatile boolean configLoaded = false;

    public boolean isConfigLoaded() {
        return configLoaded;
    }

    public void setConfigLoaded(boolean configLoaded) {
        this.configLoaded = configLoaded;
    }
}

未完待續(xù)...文章來源地址http://www.zghlxwxcb.cn/news/detail-815474.html

到了這里,關(guān)于《深入理解Java虛擬機:JVM高級特性與最佳實踐(第3版) 周志明》 - 第12章代碼示例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • “深入理解Java虛擬機(JVM):背后的工作原理解析“

    標(biāo)題:深入理解Java虛擬機(JVM):背后的工作原理解析 摘要:本文將深入探討Java虛擬機(JVM)的工作原理,包括內(nèi)存管理、垃圾回收、即時編譯器等關(guān)鍵概念,以及如何優(yōu)化代碼以提高性能。通過示例代碼和詳細(xì)解釋,讀者將對JVM的底層原理有更深入的理解。 正文: 一、

    2024年02月12日
    瀏覽(27)
  • [AIGC] 利用 chatgpt 深入理解 Java 虛擬機(JVM)

    [AIGC] 利用 chatgpt 深入理解 Java 虛擬機(JVM)

    Java 虛擬機(JVM)是 Java 編程語言的核心運行環(huán)境,它負(fù)責(zé)解釋和執(zhí)行 Java 字節(jié)碼。它是 Java 程序能夠跨平臺運行的關(guān)鍵,因為不同的操作系統(tǒng)和硬件平臺都有自己的指令集和體系結(jié)構(gòu),而 JVM 則提供了一個統(tǒng)一的運行環(huán)境,使得 Java 程序可以在不同的平臺上無需修改就能運行

    2024年02月22日
    瀏覽(21)
  • [AIGC] 深入理解 Java 虛擬機(JVM)的垃圾回收

    [AIGC] 深入理解 Java 虛擬機(JVM)的垃圾回收

    一、是什么 Java 虛擬機(JVM)的垃圾回收(Garbage Collection)是一種自動內(nèi)存管理機制,用于釋放不再使用的對象所占用的內(nèi)存空間。垃圾回收的目標(biāo)是回收那些不再被程序引用的對象,以避免內(nèi)存泄漏和內(nèi)存溢出等問題。 二、為什么需要垃圾回收 在 Java 程序中,對象的創(chuàng)建

    2024年02月21日
    瀏覽(15)
  • jvm復(fù)習(xí),深入理解java虛擬機一:運行時數(shù)據(jù)區(qū)域

    jvm復(fù)習(xí),深入理解java虛擬機一:運行時數(shù)據(jù)區(qū)域

    ? ? ? ? 程序計數(shù)器 (Program Counter Register) 它是程序控制流的指示器,簡單來說,為了線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都需要有一個獨立的程序計數(shù)器 ? ? ? ? ?Java虛擬機棧 (Java Virtual Machine Stack)也是線程私有的,它的生命周期 與線程相同。虛擬機棧描述

    2024年01月22日
    瀏覽(17)
  • “深入探索JVM內(nèi)部機制:理解Java虛擬機的運行原理“

    標(biāo)題:深入探索JVM內(nèi)部機制:理解Java虛擬機的運行原理 摘要:本篇博客將深入探索Java虛擬機(JVM)的內(nèi)部機制,幫助讀者理解JVM的運行原理。我們將介紹JVM的組成結(jié)構(gòu),包括類加載器、運行時數(shù)據(jù)區(qū)域和執(zhí)行引擎,并通過示例代碼解釋這些概念的具體應(yīng)用。 正文: 一、J

    2024年02月11日
    瀏覽(24)
  • “深入探究JVM內(nèi)部機制:理解Java虛擬機的工作原理“

    標(biāo)題:深入探究JVM內(nèi)部機制:理解Java虛擬機的工作原理 摘要:本文將深入分析Java虛擬機(JVM)的工作原理,包括類加載、內(nèi)存管理、垃圾回收和即時編譯等方面。通過詳細(xì)解釋這些概念,并給出示例代碼,幫助讀者更好地理解JVM內(nèi)部的工作機制。 正文: 一、類加載 類加載

    2024年02月12日
    瀏覽(34)
  • “深入剖析JVM內(nèi)部機制:理解Java虛擬機的工作原理“

    標(biāo)題:深入剖析JVM內(nèi)部機制:理解Java虛擬機的工作原理 介紹: Java虛擬機(JVM)是Java語言的核心組件,負(fù)責(zé)將Java源代碼轉(zhuǎn)換為可以在計算機上運行的機器碼。了解JVM的內(nèi)部機制對于開發(fā)人員來說非常重要,因為它可以幫助我們更好地理解Java程序的運行行為和性能優(yōu)化。本文

    2024年02月12日
    瀏覽(29)
  • “深入探索JVM內(nèi)部機制:理解Java虛擬機的工作原理“

    標(biāo)題:深入探索JVM內(nèi)部機制:理解Java虛擬機的工作原理 摘要:本文將深入探索Java虛擬機(JVM)的內(nèi)部機制,講解JVM的工作原理,并通過示例代碼幫助讀者更好地理解JVM的工作過程。 正文: 一、JVM概述 Java虛擬機(JVM)是Java程序的運行環(huán)境,它負(fù)責(zé)將Java字節(jié)碼轉(zhuǎn)換為機器碼

    2024年02月11日
    瀏覽(36)
  • “深入解析JVM內(nèi)部機制:理解Java虛擬機的工作原理“

    標(biāo)題:深入解析JVM內(nèi)部機制:理解Java虛擬機的工作原理 摘要:本文將深入探討Java虛擬機(JVM)的內(nèi)部機制,解釋其工作原理。我們將討論JVM的組成部分、類加載過程、運行時數(shù)據(jù)區(qū)域以及垃圾回收機制。此外,還將通過示例代碼來說明JVM的內(nèi)部工作機制。 正文: JVM的組成

    2024年02月13日
    瀏覽(36)
  • 深入理解 Java 多線程、Lambda 表達(dá)式及線程安全最佳實踐

    線程使程序能夠通過同時執(zhí)行多個任務(wù)而更有效地運行。 線程可用于在不中斷主程序的情況下在后臺執(zhí)行復(fù)雜的任務(wù)。 創(chuàng)建線程 有兩種創(chuàng)建線程的方式。 擴(kuò)展Thread類 可以通過擴(kuò)展Thread類并覆蓋其run()方法來創(chuàng)建線程: 實現(xiàn)Runnable接口 另一種創(chuàng)建線程的方式是實現(xiàn)Runnable接口

    2024年03月15日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包