激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

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

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

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

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

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

復制代碼代碼如下:

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關鍵字。

復制代碼代碼如下:

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形式,代碼如下:

復制代碼代碼如下:

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);
    }
}

 

復制代碼代碼如下:

package com.chzhao;

 

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

}

 

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

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

說明:

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 黄色片网站在线免费观看 | 一级毛片在线观看视频 | 天天夜天天操 | 亚洲精品aⅴ中文字幕乱码 中文字幕欧美在线 | 国产精选电影免费在线观看 | 精品国产一区二区三区久久久狼牙 | 免费网址黄| 午夜国内精品a一区二区桃色 | 午夜精品福利影院 | 一级做受毛片免费大片 | 少妇一级淫片免费放正片 | 成人毛片视频免费看 | 欧洲精品久久 | 久久国产乱子伦精品 | 国产精品自拍啪啪 | 黄色大片高清 | 免费h片| 免费观看黄色一级视频 | 欧美成人精品h版在线观看 久久久久久三区 | 九九热精品视频在线 | 在线视频观看国产 | 国产高清片| 欧美一级成人一区二区三区 | av在线更新 | 性高湖久久久久久久久aaaaa | 欧美日韩在线播放 | 99久久免费看精品国产一区 | 亚洲一区成人在线观看 | 91午夜免费视频 | 亚洲综合一区二区三区 | 国产精品久久久不卡 | 羞羞的网站 | 狠狠干天天操 | 久久中出 | 视频一区二区精品 | 日韩精品一区二区三区中文 | 欧美亚洲一区二区三区四区 | 一边吃奶一边摸下娇喘 | 久久9999久久 | 国产伦久视频免费观看视频 | 免费观看又色又爽又黄的崩锅 |