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法式設計有所贊助。