JUC-1-volatile

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

 

posted @ 2019-11-24 11:36  wf.zhang  阅读(192)  评论(0编辑  收藏  举报