volitate的作用
首先了解cpu和内存怎么配合的

volitate 的作用
- 线程间可见
Boolean running=true; void m(){ System.out.println("m start"); while (running){ System.out.println("m still running"); } System.out.println("m stop"); } public String test(){ new Thread(this::m,"t1").start(); try{ TimeUnit.SECONDS.sleep(1); }catch (Exception ex){ }running=false
}
我要调用m方法的时候,一直在while 循环,如果我要跳出循环 只要把runing 修改成false 方法就停了,但是上面代码while 循环没有中断,主要原因 running 这个字段存在我们的主内存中,每个线程都是在cpu 里面的,cpu 读内存的时候,会把数据自己的线程缓存里面,在没有特定同步的情况下,一直会读线程缓存里面的数据添加volatile 修饰符,修改这个修饰符后,running 字段修改, 马上通知其他线程,需要从新重内存里面读取
- 禁止指令重排
- cpu的乱序执行:cpu在进行读等待的同时执行指令,是cpu 乱码的根源不是乱,而是提高效率
假设cpu 要执行两条指令 A,B 两条指令,之间无任何关系,执行A指令的时候,会把B指令先执行
static int x = 0, y = 0, a = 0, b = 0; public String HelloWord() throws Exception { int j = 0; for (; ; ) { j++; x = 0; y = 0; a = 0; b = 0; Thread one = new Thread(new Runnable() { @Override public void run() { a = 1; x = b; } }); Thread other = new Thread(new Runnable() { @Override public void run() { b = 1; y = a; } }); one.start(); other.start(); one.join(); other.join(); String reult = "第" + j + "次(" + x + "," + y + ")"; if (x == 0 && y == 0) { System.err.println(reult); break; } } return null; }
如果没有重排序情况下,x=0,y=0 这种情况不会出现,但是实际运行中 执行到39w次的时候出现x=0,y=0


浙公网安备 33010602011771号