volatile關鍵字的作用使變量在多個線程之間可見。
package com.wkcto.volatilekw;
/**
* volatile的作用可以強制線程從公共內存中讀取變量的值,而不是從工作內存中讀取
* Author: 老崔
*/
public class Test02 {
public static void main(String[] args) {
//創建PrintString對象
PrintString printString = new PrintString();
//開啟子線程,讓子線程執行printString對象的printStringMethod()方法
new Thread(new Runnable() {
@Override
public void run() {
printString.printStringMethod();
}
}).start();
//main線程睡眠1000毫秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("在main線程中修改打印標志");
printString.setContinuePrint(false);
//程序運行,查看在main線程中修改了打印標志之后 ,子線程打印是否可以結束打印
//程序運行后, 可能會出現死循環情況
//分析原因: main線程修改了printString對象的打印標志后, 子線程讀不到
//解決辦法: 使用volatile關鍵字修飾printString對象的打印標志.
// volatile的作用可以強制線程從公共內存中讀取變量的值,而不是從工作內存中讀取
}
//定義類打印字符串
static class PrintString{
private volatile boolean continuePrint = true;
public PrintString setContinuePrint(boolean continuePrint) {
this.continuePrint = continuePrint;
return this;
}
public void printStringMethod(){
System.out.println(Thread.currentThread().getName() + "開始....");
while ( continuePrint ){
}
System.out.println(Thread.currentThread().getName() + "結束++++++++++++++");
}
}
}
volatile與synchronized比較
● volatile關鍵字是線程同步的輕量級實現,所以volatile性能肯定比synchronized要好; volatile只能修飾變量,而synchronized可以修飾方法,代碼塊. 隨著JDK新版本的發布,synchronized的執行效率也有較大的提升,在開發中使用sychronized的比率還是很大的。
● 多線程訪問volatile變量不會發生阻塞,而synchronized可能會阻塞。
● volatile能保證數據的可見性,但是不能保證原子性; 而synchronized可以保證原子性,也可以保證可見性。
● 關鍵字volatile解決的是變量在多個線程之間的可見性; synchronized關鍵字解決多個線程之間訪問公共資源的同步性。