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