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

java多線程中的volatile和synchronized用法分析

 更新時間:2014年12月18日 09:16:30   投稿:shichen2014  
這篇文章主要介紹了java多線程中的volatile和synchronized用法分析,以實例的形式分析了在多線程中volatile和synchronized的用法區(qū)別與使用原理,具有一定的參考借鑒價值,需要的朋友可以參考下

本文實例分析了java多線程中的volatile和synchronized用法。分享給大家供大家參考。具體實現(xiàn)方法如下:

復(fù)制代碼 代碼如下:
package com.chzhao;

public class Volatiletest extends Thread {

    private static int count = 0;

    public void run() {
        count++;
    }

    public static void main(String[] args) {
        Thread threads[] = new Thread[10000];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Volatiletest();
        }
        for (int i = 0; i < threads.length; i++) {
            threads[i].start();
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(count);
    }
}

代碼如上,期待輸出的是10000,然后,由于count++不是線程安全的,所以輸出經(jīng)常會小于10000.

為了解決這個問題,增加了volatile關(guān)鍵字。

復(fù)制代碼 代碼如下:
package com.chzhao;

public class Volatiletest extends Thread {

    private volatile static int count = 0;

    public void run() {
        count++;
    }

    public static void main(String[] args) {
        Thread threads[] = new Thread[10000];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Volatiletest();
        }
        for (int i = 0; i < threads.length; i++) {
            threads[i].start();
        }
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(count);
    }
}

修改之后,還經(jīng)常輸出不是10000的值。

修改為synchronized形式,代碼如下:

復(fù)制代碼 代碼如下:
package com.chzhao;

public class SynchronizedTest extends Thread {
    private static int count = 0;

    public void run() {
        synchronized (LockClass.lock) {
            count++;
        }
    }

    public static void main(String[] args) {
        Thread threads[] = new Thread[10000];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new SynchronizedTest();
        }
        for (int i = 0; i < threads.length; i++) {
            threads[i].start();
        }
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(count);
    }
}


復(fù)制代碼 代碼如下:
package com.chzhao;

public class LockClass {
    public static byte[] lock = new byte[0];

}

這樣修改之后,輸出是10000.

這樣是否說明volatile這個關(guān)鍵字完全沒用呢?只有synchronized才能保證線程安全?

說明:

Java語言包含兩種內(nèi)在的同步機制:同步塊(或方法)和 volatile 變量。這兩種機制的提出都是為了實現(xiàn)代碼線程的安全性。其中 Volatile 變量的同步性較差(但有時它更簡單并且開銷更低),而且其使用也更容易出錯。Java 語言中的 volatile 變量可以被看作是一種 “程度較輕的 synchronized”;與 synchronized 塊相比,volatile 變量所需的編碼較少,并且運行時開銷也較少,但是它所能實現(xiàn)的功能也僅是 synchronized 的一部分。

也就是說,在某些情況下,volitile比synchronized用起來更方便,當(dāng)然,同步性更差一點。

希望本文所述對大家的Java程序設(shè)計有所幫助。

相關(guān)文章

  • SpringMVC如何域?qū)ο蠊蚕頂?shù)據(jù)

    SpringMVC如何域?qū)ο蠊蚕頂?shù)據(jù)

    在Spring MVC中,可以使用域?qū)ο髞砉蚕頂?shù)據(jù),域?qū)ο笫且粋€Map類型的對象,可以在請求處理方法之間共享數(shù)據(jù),本文給大家介紹SpringMVC 域?qū)ο蠊蚕頂?shù)據(jù)的示例代碼,一起看看吧
    2023-09-09
  • Java全面分析面向?qū)ο笾庋b

    Java全面分析面向?qū)ο笾庋b

    或許大家都聽說過java是純面向?qū)ο笳Z言,面向?qū)ο笏枷胍簿褪俏覀兂Uf的OOP,我們聽說最多的思想就是繼承,封裝,多態(tài),今天我們來講一講封裝
    2022-04-04
  • Java 創(chuàng)建URL的常見問題及解決方案

    Java 創(chuàng)建URL的常見問題及解決方案

    這篇文章主要介紹了Java 創(chuàng)建URL的常見問題及解決方案的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • servlet實現(xiàn)文件上傳、預(yù)覽、下載、刪除功能

    servlet實現(xiàn)文件上傳、預(yù)覽、下載、刪除功能

    這篇文章主要為大家詳細介紹了servlet實現(xiàn)文件上傳、預(yù)覽、下載、刪除功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Java空集合使用場景與填坑記錄

    Java空集合使用場景與填坑記錄

    這篇文章主要給大家介紹了關(guān)于Java空集合使用場景與填坑的相關(guān)資料,并且給大家介紹了java判斷集合是否為空的方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • 使用注解@Validated效驗VO參數(shù)是否合規(guī)

    使用注解@Validated效驗VO參數(shù)是否合規(guī)

    這篇文章主要為大家介紹了使用注解@Validated效驗VO參數(shù)是否合規(guī)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 關(guān)于Java中@SuppressWarnings的正確使用方法

    關(guān)于Java中@SuppressWarnings的正確使用方法

    這篇文章主要介紹了關(guān)于Java中@SuppressWarnings的正確使用方法,@SuppressWarnings注解主要用在取消一些編譯器產(chǎn)生的警告對代碼左側(cè)行列的遮擋,有時候這會擋住我們斷點調(diào)試時打的斷點,需要的朋友可以參考下
    2023-05-05
  • springboot實現(xiàn)多實例crontab搶占定時任務(wù)(實例代碼)

    springboot實現(xiàn)多實例crontab搶占定時任務(wù)(實例代碼)

    這篇文章主要介紹了springboot實現(xiàn)多實例crontab搶占定時任務(wù),本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • Java?Stream流使用最多的方式示例詳解

    Java?Stream流使用最多的方式示例詳解

    在 Java 編程中,Stream 流提供了一種高效、便捷的方式來處理集合數(shù)據(jù),本文將詳細介紹 Java 中 Stream 流的用法,包括基礎(chǔ)用法、中級用法、高級用法以及一些特殊方法的使用,感興趣的朋友一起看看吧
    2024-12-12
  • MyBatis中的properties配置(推薦)

    MyBatis中的properties配置(推薦)

    這篇文章給大家介紹了MyBatis中的properties配置,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-12-12

最新評論

边坝县| 北海市| 和龙市| 文昌市| 元朗区| 罗城| 同德县| 陇川县| 田阳县| 三明市| 忻州市| 金堂县| 嫩江县| 略阳县| 鹿邑县| 石泉县| 绵竹市| 木里| 孝感市| 灵石县| 长春市| 延川县| 吉首市| 青神县| 丰县| 十堰市| 岐山县| 竹山县| 平远县| 屏山县| 独山县| 澳门| 兰西县| 德钦县| 青海省| 桦南县| 离岛区| 孟州市| 若尔盖县| 淮南市| 渝北区|