volatile關鍵字的意思是要讓共享及時通知java
多個線程同時共享lock變量。緩存
源於JMM JAVA 內存模型中的線程的【工做內存】+【主內存】相似於真實CPU的【緩存】+【內存】ide
多個線程共享變量 a,則每一個每一個線程都會在本身的工做內存中保留一份副本!這就會帶來多個工做內存之間的副本在本身讀寫的時候,會致使不一致!線程
一、加了volatile修飾的變量,若是有一個線程對其進行寫操做,code
A、強制其必定要刷新寫到主內存中!內存
B、其餘線程工做內存中的副本都會失效!必須到主內存中去從新獲取,刷新!io
C、這樣就保證了共享變量內存的及時可見性!class
1、如下是使用volatile修飾共享變量(這裏當作信號量)變量
public class Test { private volatile int lock = 1; public void volatileTest() { Runnable runnable1 = new Runnable() { @Override public void run() { int n = 0; while (lock == 1){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("T1--"+ n++ +":runnable is running..."); } System.out.println("T1--"+ n+":runnable is run out..."); } }; Runnable runnable2 = new Runnable() { @Override public void run() { int n = 0; while (lock == 1){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("T2--"+ n++ +":runnable is running..."); } System.out.println("T2--"+ n+":runnable is run out..."); } }; Runnable runnable3 = new Runnable() { @Override public void run() { try { Thread.sleep(3000); System.out.println("我要中斷你!!!!"); lock = 0; } catch (InterruptedException e) { e.printStackTrace(); } } }; Thread t1 = new Thread(runnable1); Thread t2 = new Thread(runnable2); Thread t3 = new Thread(runnable3); t1.start(); t2.start(); t3.start(); } }
結果以下:while
T2--0:runnable is running... T1--0:runnable is running... T2--1:runnable is running... T1--1:runnable is running... 我要中斷你!!!! T2--2:runnable is running... T1--2:runnable is running... T1--3:runnable is run out... T2--3:runnable is run out...