本文實(shí)例分析了java多線程中的volatile和synchronized用法。分享給大家供大家參考。具體實(shí)現(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)常會(huì)小于10000.
為了解決這個(gè)問(wèn)題,增加了volatile關(guān)鍵字。
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.
這樣是否說(shuō)明volatile這個(gè)關(guān)鍵字完全沒(méi)用呢?只有synchronized才能保證線程安全?
說(shuō)明:
Java語(yǔ)言包含兩種內(nèi)在的同步機(jī)制:同步塊(或方法)和 volatile 變量。這兩種機(jī)制的提出都是為了實(shí)現(xiàn)代碼線程的安全性。其中 Volatile 變量的同步性較差(但有時(shí)它更簡(jiǎn)單并且開銷更低),而且其使用也更容易出錯(cuò)。Java 語(yǔ)言中的 volatile 變量可以被看作是一種 “程度較輕的 synchronized”;與 synchronized 塊相比,volatile 變量所需的編碼較少,并且運(yùn)行時(shí)開銷也較少,但是它所能實(shí)現(xiàn)的功能也僅是 synchronized 的一部分。
也就是說(shuō),在某些情況下,volitile比synchronized用起來(lái)更方便,當(dāng)然,同步性更差一點(diǎn)。
希望本文所述對(duì)大家的Java程序設(shè)計(jì)有所幫助。