什么是volatile关键字
volatile是轻量级同步机制,与synchronized相比,他的开销更小一些,同时安全性也有所降低,在一些特定的场景下使用它可以在完成并发目标的基础上有一些性能上的优势.
volatile修饰的变量对所有线程的可见性
为什么用volatile
解决 多个线程操作共享数据(这个数据在内存中) 彼此得到内存中共享数据不可见
也就是说多个线程操作要操作同一个变量 , 某个线程改变了变量的值 , 其他线程也能看到改变后的变量的值
如何用volatile
两个线程
ThreadDemo的线程
main线程 里面关注while循环
.png)
ThreadDemo类中定义一个变量flag
.png)
ThreadDemo的线程已经结束 打印出flag=true
main线程没有停止 原因 while语句中得到的是flag=false 一直在循环 出现了 内存不可见的场景
.png)
使用volatile关键字修饰 flag 变量
.png)
两个线程都结束 都能拿到内存中 flag=true数据
.png)

1 package com.wf.zhang.juc;
2
3 public class TestVolatile {
4
5 public static void main(String[] args) {
6 ThreadDemo t =new ThreadDemo();
7 new Thread(t).start();
8
9 while (true){
10 if (t.isFlag()){
11 System.out.println("------------------");
12 break;
13 }
14 }
15 }
16 }
17
18 class ThreadDemo implements Runnable {
19
20 private volatile boolean flag = false;
21
22 public boolean isFlag() {
23 return flag;
24 }
25
26 public void setFlag(boolean flag) {
27 this.flag = flag;
28 }
29
30 @Override
31 public void run() {
32
33 try {
34 Thread.sleep(100);
35 } catch (InterruptedException e) {
36 }
37
38 flag = true;
39
40 System.out.println("flag=" + isFlag());
41
42 }
43 }
