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...