volitate的作用

时间:2020-05-09
本文章向大家介绍volitate的作用,主要包括volitate的作用使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

volitate 的作用

  1.  线程间可见

    1. 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  字段修改, 马上通知其他线程,需要从新重内存里面读取

  2. 禁止指令重排
  1. 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

原文地址:https://www.cnblogs.com/swp-code/p/12857557.html