国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

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

2019-11-26 15:20:08
字體:
供稿:網(wǎng)友

本文實(shí)例分析了java多線程中的volatile和synchronized用法。分享給大家供大家參考。具體實(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è)問題,增加了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這個(gè)關(guān)鍵字完全沒用呢?只有synchronized才能保證線程安全?

說明:

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

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

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 台东县| 武胜县| 伊宁市| 青岛市| 六枝特区| 同仁县| 定远县| 将乐县| 连城县| 边坝县| 锡林郭勒盟| 磐安县| 志丹县| 江都市| 马山县| 万荣县| 龙泉市| 云和县| 江陵县| 延寿县| 肃北| 东光县| 砚山县| 长海县| 黎平县| 保山市| 聊城市| 黄平县| 东安县| 江油市| 札达县| 鄢陵县| 仙桃市| 策勒县| 侯马市| 启东市| 东乌珠穆沁旗| 靖远县| 临沂市| 寿光市| 泾阳县|