并发编程 1

并发

jmm

java 内存模型,这个东西目前先不跟jvm模型对应起来。

存在一个工作内存、驻内存的概念

线程间通信

  • cas

    原子性 有序性 可见性

 

结合一个两个线程之间交互的例子

public class Start {

   private boolean flag = true;

   private void work() {
       int count = 0;
       System.out.println("start work");
       while (flag) {
           count++;
      }
       System.out.println("work stop " + count);
  }

   private void stop() {
       flag = false;
       System.out.println("work should stop");
  }

   public static void main(String[] args) throws InterruptedException {
       Start start = new Start();
       Thread work = new Thread(() -> start.work());
       Thread stopWork = new Thread(() -> start.stop());
       work.start();
       Thread.sleep(1000);
       stopWork.start();
  }

}

为什么这里另一个线程把flag整成false,反而没有停止。

内存屏障?

清除工作内存中的值

  • Thread.yield()

    会释放时间片,再次获取时间片的时候,加载上下文的时候,会从主内存中把最新的值取出来

  • 内存屏障

    这个就是保证了变量的可见性,是利用jvm的内存屏障来做的

    保证对目标的修改立即刷回主存,并使其他工作内存中的副本立即失效

    • volitile关键字

    • sync关键字

    以上这些到底层就是基于内存屏障来做的。

  •  

 

posted @ 2022-08-14 16:33  sunnysgw  阅读(23)  评论(0)    收藏  举报