标签:顺序 generate local 数据 volatile sys class interrupt oid
让其他线程能够马上感知到某一线程对某个变量的修改。
1)保证可见性,对共享变量的修改,其他线程马上能感知到,但不能保证原子性。
2)保证有序性,在JVM的编译阶段和指令优化排序阶段,对于volatile修饰的变量,其代码顺序不会改变。
(1)使用上的区别
Volatile只能修饰变量,synchronized只能修饰方法和语句块
(2)对原子性的保证
synchronized可以保证原子性,Volatile不能保证原子性
(3)对可见性的保证
都可以保证可见性,但实现原理不同
Volatile对变量加了lock,synchronized使用monitorEnter和monitorexit monitor JVM
(4)对有序性的保证
Volatile能保证有序,synchronized可以保证有序性,但是代价(重量级)并发退化到串行
(5)其他
synchronized引起阻塞
Volatile不会引起阻塞
1 public class VolitaleDemo01 { 2 3 final static int MAX = 5; 4 //static int init_value = 0;如果不加volatile,不能保证更新完后读数据 5 static volatile int init_value = 0; 6 7 public static void main(String[] args) { 8 new Thread(()->{ 9 int localValue = init_value; 10 while(localValue<MAX){ 11 if(localValue!=init_value){ 12 System.out.println("Reader:"+init_value); 13 localValue = init_value; 14 } 15 } 16 },"Reader").start(); 17 new Thread(()->{ 18 int localValue = init_value; 19 while(localValue<MAX){ 20 System.out.println("Updater:"+(++localValue)); 21 init_value = localValue; 22 try { 23 TimeUnit.SECONDS.sleep(2); 24 } catch (InterruptedException e) { 25 // TODO Auto-generated catch block 26 e.printStackTrace(); 27 } 28 } 29 },"Updater").start(); 30 } 31 32 }
标签:顺序 generate local 数据 volatile sys class interrupt oid
原文地址:https://www.cnblogs.com/wk-missQ1/p/12369854.html