JUC多线程及高并发
1.什么是volatile?
volatile是Java虚拟机提供的轻量级同步机制,有三大特性(必背),保证可见性;不保证原子性,禁止指令重排!
JVM(Java虚拟机)
JMM(Java内存模型)(接触高并发需要明白)
JMM是一种不存在的抽象概念,是一种习惯,规范,定义了程序中的各个变量的访问方式。
JMM关于同步的规定:
①线程解锁前,必须把共享变量的值刷新回主内存;
②线程加锁前,必须读取主内存的最新值到自己的工作内存(各自线程中的工作内存);
③加锁解锁是同一把锁。
线程对变量的操作必须是在工作内存中,首先要将变量从主内存拷贝到自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存中。
不同线程中的工作内存无法进行访问,线程之间的通信必须通过主内存来完成。
当线程中的共享变量传输到主内存时,其他线程需要同时知道变量已经修改,这就依靠JMM做到的可见性。
//可见性
class MyData{
volatile int number = 0;
public void addT060(){
this.number = 60;
}
}
//验证volatile可见性
//例如int number = 0;number变量之前根本没有加volatilea关键字修饰
public class VolatileDemo{
public static void main(String[] args){
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.addT060();
System.out.println(Thread.currentThread().getName()+"\t update number value:"+
myData.number)
},"AAA").start();
while(myData.number==0){
//main线程一直在这里等待循环,直到number不再等于0
}
System.out.println(Thread.currentThread().getName+
"\t mission is over,main get number value:"+myData.number);
}
}
JMM有可见性,原子性,有序性,VolatileDemo代码演示可见性+原子性代码