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

show一下java中的volatile的作用

編輯:關於JAVA

具體作用就不多講了,大概就是保證可見性和防止重排序。 其實很早前就知道有這個關鍵字,試過很多次,總覺得加了和沒加效果一樣。

這次終於在閱讀《java並發程序實踐》(順便義務廣告一下,好書)的時候有了靈感,寫了一段很普通的代碼:

Java代碼

public class NoVisibility {
private boolean ready=false;
int num;
private class ReaderThread extends Thread {
public void run() {
int count = 0;
while (!ready) 
{
count++;
}
System.out.println(num);
}
}

public static void main(String[] args) throws InterruptedException {
NoVisibility x = new NoVisibility();
x.new ReaderThread().start();
x.num = 43;
x.ready = true;
System.out.println("main Thread end");
}
}

再寫一段python來不停地調用它(因為不一定總能出現),不久後就會發現不返回了,ready值的更新一直對ReaderThread線程不可見。如果ready加個volatile就不會有問題了,可以一直運行。

Python代碼

import os
i=0
while True:
os.system("java -server NoVisibility")#or os.popen
i+=1
print "run count"+str(i)

感受:

1.java運行時加參數-server用server版的虛擬機出問題幾率很高,據說是server才經過大量優化。

2.while (!ready)的循環內如果有System.out操作時,也幾乎不出問題,提高了可見性?(這個是我的猜測)

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