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

服務(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ì)有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美另类videos另类粗暴 | 美女脱了内裤让男生尿囗 | 双性总裁被调教1v1 双性双根 | 精品久久99麻豆蜜桃666 | 91网红福利精品区一区二 | eee在线播放成人免费 | 1024视频色版在线网站 | 国模一区二区三区视频一 | 色橹| 青青草原国产一区二区 | 欧美人与禽杂交大片 | avtt在线观看 | 亚洲一级片在线播放 | 国产普通话对白露脸流出 | 亚洲国产综合久久精品 | 男同gay玩奴男同玩奴 | 日本免费高清在线观看播放 | 欧美区在线 | 国产精品视频网 | 特级淫片大乳女子高清视频 | 四虎精品免费视频 | 91九色在线视频 | 国产精品久久亚洲一区二区 | 免费片在线观看高清 | 久久久精品国产免费A片胖妇女 | 日本在线观看www | 天色综合 | 日本在线观看视频网站 | 免费看男女做好爽好硬视频 | bnb998八度免费影院丫意浓 | 欧美成人精品第一区二区三区 | 男人天堂视频网 | 国语对白做受xxxx | 99久久免费国内精品 | 亚洲日本中文字幕天天更新 | 日本免费一区二区三区 | 波多野结衣被绝伦强在线观看 | 国产精品麻豆免费版 | 极品在线 | 青青草成人在线 | 美女毛片在线 |