一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - java多線程中的volatile和synchronized用法分析

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

2019-12-07 15:48shichen2014 JAVA教程

這篇文章主要介紹了java多線程中的volatile和synchronized用法分析,以實(shí)例的形式分析了在多線程中volatile和synchronized的用法區(qū)別與使用原理,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例分析了java多線程中的volatilesynchronized用法。分享給大家供大家參考。具體實(shí)現(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)常會(huì)小于10000.

為了解決這個(gè)問(wèn)題,增加了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.

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

說(shuō)明:

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产麻豆91网在线看 | 九草在线视频 | 天堂网www在线中文天堂 | 91精品免费国产高清在线 | 1024国产基地永久免费 | 国产精品日韩欧美一区二区 | 亚洲+国产+图片 | 99精品在线视频观看 | 欧美日韩中文国产一区二区三区 | 日韩高清在线高清免费 | xxxx18日本视频xxxxx | 好看华人华人经典play | 91东航翘臀女神在线播放 | 免费视频 久久久 | 精品美女国产互换人妻 | 久草在线精彩免费视频 | 激情视频在线播放 | 日本卡一卡2卡3卡4精品卡无人区 | 日本道在线播放 | 午夜爱 | 青青自拍视频 | 岛国在线播放v片免费 | 日韩欧美一区二区三区中文精品 | 大桥未久aⅴ一区二区 | 日韩高清成人毛片不卡 | 好吊色视频988gao在线观看 | 亚洲第9页| 扒开女人屁股眼看个够 | 亚洲欧美专区精品伊人久久 | 国产成人综合一区精品 | 成人免费网址 | 精品无人区乱码1区2区3区在线 | 天天综合天天影视色香欲俱全 | a级成人毛片免费图片 | 99热影院| 亚洲天堂免费 | 国产videos hd | 日韩一级欧美一级一级国产 | 国产99区 | 网站久久 | 日本高清中文字幕视频在线 |