欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2014年12月18日 09:16:30   投稿:shichen2014  
這篇文章主要介紹了java多線程中的volatile和synchronized用法分析,以實例的形式分析了在多線程中volatile和synchronized的用法區(qū)別與使用原理,具有一定的參考借鑒價值,需要的朋友可以參考下

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

為了解決這個問題,增加了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這個關(guān)鍵字完全沒用呢?只有synchronized才能保證線程安全?

說明:

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

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

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

相關(guān)文章

  • Java如何利用POI讀取Excel行數(shù)

    Java如何利用POI讀取Excel行數(shù)

    這篇文章主要介紹了java如何利用POI讀取Excel行數(shù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • 解析spring事務(wù)管理@Transactional為什么要添加rollbackFor=Exception.class

    解析spring事務(wù)管理@Transactional為什么要添加rollbackFor=Exception.class

    這篇文章主要介紹了spring事務(wù)管理@Transactional為什么要添加rollbackFor=Exception.class,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • Spring Cloud Feign原理詳解

    Spring Cloud Feign原理詳解

    Feign 主要是幫助我們方便進行rest api服務(wù)間的調(diào)用,本文從Spring Cloud對feign封裝的源碼中去了解其主要實現(xiàn)機制
    2021-06-06
  • Java中id,pid格式數(shù)據(jù)轉(zhuǎn)樹和森林結(jié)構(gòu)工具類實現(xiàn)

    Java中id,pid格式數(shù)據(jù)轉(zhuǎn)樹和森林結(jié)構(gòu)工具類實現(xiàn)

    本文主要介紹了Java中id,pid格式數(shù)據(jù)轉(zhuǎn)樹和森林結(jié)構(gòu)工具類實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Java 自定義動態(tài)數(shù)組方式

    Java 自定義動態(tài)數(shù)組方式

    這篇文章主要介紹了Java自定義動態(tài)數(shù)組方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Java Swing實現(xiàn)JTable檢測單元格數(shù)據(jù)變更事件的方法示例

    Java Swing實現(xiàn)JTable檢測單元格數(shù)據(jù)變更事件的方法示例

    這篇文章主要介紹了Java Swing實現(xiàn)JTable檢測單元格數(shù)據(jù)變更事件的方法,結(jié)合完整實例形式分析了Swing實現(xiàn)JTable檢測單元格數(shù)據(jù)變更事件過程中出現(xiàn)的問題與相關(guān)解決方法,需要的朋友可以參考下
    2017-11-11
  • SpringBoot中Tomcat和SpringMVC整合源碼分析

    SpringBoot中Tomcat和SpringMVC整合源碼分析

    Tomcat和SpringMVC都是通過這樣的方式進行集成的,SpringBoot出現(xiàn)之前SpringMVC項目是直接部署在Tomcat服務(wù)器中的,這篇文章主要介紹了SpringBoot中Tomcat和SpringMVC整合源碼分析,需要的朋友可以參考下
    2022-07-07
  • Java單例模式的幾種常見寫法

    Java單例模式的幾種常見寫法

    這篇文章主要介紹了Java單例模式的幾種寫法,單例模式是面試中的??土耍R妼懛ㄓ?4?種:餓漢模式、懶漢模式、靜態(tài)內(nèi)部類和枚舉,接下來我們一起進入文章看看吧
    2022-05-05
  • Kafka利用Java實現(xiàn)數(shù)據(jù)的生產(chǎn)和消費實例教程

    Kafka利用Java實現(xiàn)數(shù)據(jù)的生產(chǎn)和消費實例教程

    這篇文章主要給大家介紹了關(guān)于Kafka利用Java實現(xiàn)數(shù)據(jù)的生產(chǎn)和消費的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Spring boot集成Mybatis的方法教程

    Spring boot集成Mybatis的方法教程

    這篇文章主要給大家介紹了Spring boot集成Mybatis的方法教程,文中介紹的非常詳細,對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-04-04

最新評論