程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java多線程中的volatile和synchronized用法剖析

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

編輯:關於JAVA

java多線程中的volatile和synchronized用法剖析。本站提示廣大學習愛好者:(java多線程中的volatile和synchronized用法剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是java多線程中的volatile和synchronized用法剖析正文


本文實例剖析了java多線程中的volatile和synchronized用法。分享給年夜家供年夜家參考。詳細完成辦法以下:
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++不是線程平安的,所以輸入常常會小於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);
    }
}

修正以後,還常常輸入不是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 變量。這兩種機制的提出都是為了完成代碼線程的平安性。個中 Volatile 變量的同步性較差(但有時它更簡略而且開支更低),並且其應用也更輕易失足。Java 說話中的 volatile 變量可以被看做是一種 “水平較輕的 synchronized”;與 synchronized 塊比擬,volatile 變量所需的編碼較少,而且運轉時開支也較少,然則它所能完成的功效也僅是 synchronized 的一部門。

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

願望本文所述對年夜家的Java法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved