国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看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語言包含兩種內在的同步機制:同步塊(或方法)和 volatile 變量。這兩種機制的提出都是為了實現(xiàn)代碼線程的安全性。其中 Volatile 變量的同步性較差(但有時它更簡單并且開銷更低),而且其使用也更容易出錯。Java 語言中的 volatile 變量可以被看作是一種 “程度較輕的 synchronized”;與 synchronized 塊相比,volatile 變量所需的編碼較少,并且運行時開銷也較少,但是它所能實現(xiàn)的功能也僅是 synchronized 的一部分。

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

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

延伸 · 閱讀

精彩推薦
627
主站蜘蛛池模板: 国产美女一区 | 欧美在线视频一区 | 成人看片毛片免费播放器 | 国产一级一级国产 | 日韩精品视频在线播放 | 黄色av网站在线免费观看 | 黄色小视频在线观看 | 九九久久精品 | 黄网站色 | 久久综合激情 | 日韩精品无码一区二区三区 | 午夜视频一区 | 久久久精品免费视频 | 亚洲精品一二三区 | 欧美成人第一页 | 人人人射 | 欧美在线一区二区 | 日本三级中国三级99人妇网站 | www,四虎| 欧美精品v国产精品v日韩精品 | 不用播放器的免费av | 依人九九宗合九九九 | 久久久久久久一区 | 日本一区二区高清视频 | 日韩中文一区二区三区 | 国产毛片久久久 | 久久成人国产精品 | 亚洲精品影院 | 亚洲免费在线观看 | 高清一区二区三区 | 在线精品一区 | 日韩精品成人 | 国产一区av在线 | 超碰人人干人人 | 91中文字幕 | 91免费在线看 | 国产v日产∨综合v精品视频 | 国产精品久久久久久久久软件 | 一区二区三区回区在观看免费视频 | 夜夜骑av | 免费网站色 |