虽然自己明白什么是原子性,什么是可见性。但今天有空余时间,所以就当是加强理解。
实例:
public class MyData {
//当我们对变量添加Volatile的时候将会看见其可见性
volatile int number = 0;
public void aVoid(){
this.number=60;
}
//不添加synchronized就不能保证原子性,因为Volatile不保证原子性
public synchronized void addNumber(){
number++;
}
}
/**
* 原子性
* 不可分割,完整性,
* 也即是某个线程在做摸个业务时,中间不可以被加塞或则分割。
* 需要整体完整,要么同时成功,要么同时失败。
*/
class VolatileDemo{
public static void main(String[] args) {
MyData myData = new MyData();
for (int i =1;i<=20; i++){
new Thread(()->{
for (int j= 1;j<=1000; j++){
myData.addNumber();
}
},String.valueOf(i)).start();
}
while (Thread.activeCount()>2){
Thread.yield();
}
System.out.println(Thread.currentThread().getName()+"\t finally number"+myData.number);
}
//可见性
private static void seeByVolatile() {
MyData myData = new MyData();
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"\t come in");
try {
TimeUnit.SECONDS.sleep(3);
}catch (InterruptedException e){
e.printStackTrace();
}
myData.aVoid();
System.out.println(Thread.currentThread().getName()+"\t update number value"+myData.number);
},"AAA").start();
while (myData.number==0){
//没有可见性的情况将会死循环
}
System.out.println(Thread.currentThread().getName()+"\t mission is over");
}
}