volatile:一个线程修改了某一个共享变量的值,其他线程也是否能够立即知道这个修改的
1.主要是让该“变量”在多个线程中可见,在java中每一个线程都有一块自己的工作区,其中就存放着所有线程“共享变量”的变量值的拷贝、复制。
2.当线程执行时,他在自己的工作内存区操作的这些变量,为了存取这些变量,一个线程通常会先去获取锁,并去除它的内存工作区,把这个共享变量从所有线程的
的工作区拿到他自己的工作内存区,当自己操作完成后,解锁并把该变量的值重新“刷新写入”到共享内存中。
3.线程的操作:使用、赋值、装载、存储、锁定、解锁
4.主内存可以执行:read、wrlte、lock、unlock 原子性操作
5.强制线程去主内存中(共享变量)去读取变量,而不是去此案的工作内存区取出、从而实现了多个线程的变量可见性,满足线程安全。
package demo1;
/**
* Created by liudan on 2017/7/2.
*/
public class MyThread_volatile extends Thread {
private volatile boolean isRunning = true;
public void setRunning(boolean running) {
isRunning = running;
}
@Override
public void run() {
System.err.println("进入 run 方法");
while (isRunning==true){
/* System.err.println("run 方法操作中.................");*/
}
System.err.println("停止run 方法");
}
public static void main(String[] args) throws InterruptedException {
MyThread_volatile thread_volatile = new MyThread_volatile();
thread_volatile.start();
Thread.sleep(3000);
thread_volatile.setRunning(false);
System.err.println("setRunning 方法");
Thread.sleep(1000);
System.err.println("结束:"+thread_volatile.isRunning);
}
- }
- 输出:
- 进入 run 方法 setRunning 方法 停止run 方法 结束:false