vlolatile修饰的变量可以做为共享变量,在多线程中可见。意思是,在一个线程中volatile修饰的变量修改了,其他调用此变量的线程中同样可以看到修改。
场景
两个线程A、B,B在A中,A修改了B中的变量值,B中可以看到修改。
代码
public class UseVolatile extends Thread{
private int count = 0;
private void setCount(int count) {
this.count = count;
}
public void run() {
System.err.println("进入run方法。。。");
while(count == 0) {
//。。。
}
System.err.println("线程结束。。。");
}
public static void main(String[] args) {
UseVolatile uv = new UseVolatile();
uv.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//修改count的值,期待nv线程结束
uv.setCount(5);
System.err.println("已经修改count的值。。");
}
}
测试结果:
执行main方法后uv线程并没有结束。
用volatile修改count变量再测试
private volatile int count = 0;
结果为:
可见volatie修饰的变量能在多线程中共享,那么volatile是如何实现的呢?这要从线程和主内存谈起。
一个线程可执行的操作有使用、赋值、装载、存储、锁定、解锁。
主内存可执行的操作为读、写、锁定、解锁
volatie的作用就是强制线程从主内存共享变量中去读取变量,而不是从线程工作内存区读取,从而实现了多线程之间的变量可见。