packagecom.dreamer.multithread.day02;publicclassDemo04{privatestaticint x =0;privatestaticObject lock =newObject();publicstaticvoidmain(String[] args){newThread(()->{synchronized(lock){
x =10;}}).start();newThread(()->{synchronized(lock){System.out.println(x);}}).start();}}
2. volatile
变量用volatile修饰,一个线程对其的修改,对于其他线程来说是可见的
packagecom.dreamer.multithread.day02;publicclassDemo05{privatestaticvolatileint x =0;publicstaticvoidmain(String[] args){newThread(()-> x =10).start();newThread(()->System.out.println(x)).start();}}
3. 起步
线程start前对变量的写操作,对该线程开始后的读操作是可见的
packagecom.dreamer.multithread.day02;publicclassDemo06{privatestaticint x =0;publicstaticvoidmain(String[] args){
x =10;newThread(()->System.out.println(x)).start();}}
4
线程结束前对变量的写操作,对其他线程得知它结束后的读操作可见性(如调用join方法)
packagecom.dreamer.multithread.day02;publicclassDemo07{privatestaticint x =0;publicstaticvoidmain(String[] args)throwsInterruptedException{Thread thread =newThread(()-> x =10);
thread.start();
thread.join();System.out.println(x);}}
5. 默认值
对变量默认值的写,0,false,null,其他线程对该变量可见
6. 传递性
其实就是volatile的读屏障和写屏障问题
packagecom.dreamer.multithread.day02;publicclassDemo08{privatestaticint x =0;privatestaticvolatileint y =0;publicstaticvoidmain(String[] args){newThread(()->{
x =10;
y =20;// 写屏障,会将上面的操作全部赋值到主存中去}).start();newThread(()->{System.out.println(x);System.out.println(y);}).start();}}
一、原理底层实现是内存屏障,Memory Barrier(Memory Fence)1. 可见性1.1 写屏障(sfence)被voliate修饰的变量,会在写操作后,加上写屏障在该屏障之前的所有改动,都会同步到主存中去package com.dreamer.multithread.day02;public class Demo03 { private static int number = 0; private static volatile int age =