voliate關(guān)鍵字
1 使變量在線程間可見(jiàn)
對(duì)于避免不可見(jiàn)性問(wèn)題,Java還提供了一種弱形式的同步谎碍,即使用了volatile關(guān)鍵字。該關(guān)鍵字確保了對(duì)一個(gè)變量的更新對(duì)其他線程可見(jiàn)。當(dāng)一個(gè)變量被聲明為volatile時(shí)候灾锯,線程寫(xiě)入時(shí)候不會(huì)把值緩存在寄存器或者或者在其他地方,當(dāng)線程讀取的時(shí)候會(huì)從主內(nèi)存重新獲取最新值嗅榕,而不是使用當(dāng)前線程的拷貝內(nèi)存變量值顺饮。volatile雖然提供了可見(jiàn)性保證,但是不能使用他來(lái)構(gòu)建復(fù)合的原子性操作凌那,也就是說(shuō)當(dāng)一個(gè)變量依賴其他變量或者更新變量值時(shí)候新值依賴當(dāng)前老值時(shí)候不在適用兼雄。與synchronized相似之處在于如圖
如圖線程A修改了volatile變量b的值,然后線程B讀取了改變量值帽蝶,那么所有A線程在寫(xiě)入變量b值前可見(jiàn)的變量值赦肋,在B讀取volatile變量b后對(duì)線程B都是可見(jiàn)的,圖中線程B對(duì)A操作的變量a,b的值都可見(jiàn)的嘲碱。volatile的內(nèi)存語(yǔ)義和synchronized有類似之處金砍,具體說(shuō)是說(shuō)當(dāng)線程寫(xiě)入了volatile變量值就等價(jià)于線程退出synchronized同步塊(會(huì)把寫(xiě)入到本地內(nèi)存的變量值同步到主內(nèi)存),讀取volatile變量值就相當(dāng)于進(jìn)入同步塊(會(huì)先清空本地內(nèi)存變量值麦锯,從主內(nèi)存獲取最新值)恕稠。
轉(zhuǎn)自http://ifeve.com/%E9%AB%98%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E5%BF%85%E5%A4%87%E5%9F%BA%E7%A1%80/
/**
* Created by lixiaodong on 2017/6/23.
*/
public class Test extends Thread{
//voliate
private String i ="sss";
private void setI(String i){
this.i=i;
}
@Override
public void run() {
System.out.println("進(jìn)入方法"+i);
while (i.equals("sss")){
// System.out.println("方法執(zhí)行");
//
// try {
// Thread.sleep(3000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
}
System.out.println("線程結(jié)束");
}
public static void main(String[] args ) throws InterruptedException{
Test test=new Test();
test.start();
Thread.sleep(1000);
System.out.println("線程設(shè)置了stop");
test.setI("線程設(shè)置了stop");
}
}
上面是一個(gè)簡(jiǎn)單的示例。
- 首先運(yùn)行代碼,可以看到,盡管將變量設(shè)置了stop,test線程并沒(méi)有如預(yù)期的停止.說(shuō)明,test線程內(nèi)的i的并沒(méi)有被修改,test只是在start時(shí)將i變量拷貝到了線程自有的一塊空間內(nèi),與主線內(nèi)的i變量互不影響.
- 將voliate關(guān)鍵字放在變量i的聲明上,運(yùn)行發(fā)現(xiàn)程序正常停止.可見(jiàn)變量i在任何一個(gè)線程內(nèi)都是可見(jiàn)的,當(dāng)變量i在主線程被修改時(shí),子線程立即獲得了被更新的值.
- 最坑的地方來(lái)了,打開(kāi)代碼中的while循環(huán)中的打印語(yǔ)句,將voliate關(guān)鍵字注釋掉,執(zhí)行代碼.神奇的事情發(fā)生了,程序正常的停止了,WTF!(在我最開(kāi)始研究voliate的時(shí)候,我一直有這句輸出語(yǔ)句,一直得不到正確結(jié)果)這是為啥呢扶欣?下面這段話基本說(shuō)明了問(wèn)題,同時(shí)你也可以將輸出語(yǔ)句注釋點(diǎn),打開(kāi)sleep的注釋,看看結(jié)果.