http://521daxue.wikidot.com/hmwangduh https://vk.com/id690753581 https://vk.com/public209578729 https://vk.com/public209578716 https://vk.com/public209578706 https://vk.com/public209578700 https://vk.com/public209578693 https://vk.com/public209578677 https://vk.com/public209578671 https://vk.com/public209578660 https://vk.com/public209578655 https://vk.com/public209578647 https://vk.com/public209578639 https://vk.com/public209578620 https://vk.com/public209511857 https://vk.com/public209511580 https://vk.com/public209511287 https://vk.com/public209511116 https://vk.com/public209510911 https://vk.com/public209510773 https://vk.com/public209510425 https://vk.com/public209510300 https://vk.com/public209510020 https://vk.com/public209509912 https://vk.com/public209509711 https://vk.com/public209509707 https://vk.com/public209509699 https://vk.com/public209468344 https://vk.com/public209468335 https://vk.com/public209468320 https://vk.com/public209468312 https://vk.com/public209468304 https://vk.com/public209468299 https://vk.com/public209468293 https://vk.com/public209468283 https://vk.com/public209468271 https://vk.com/public209468261 https://vk.com/public209468250 https://vk.com/public209468240 https://vk.com/public209468230 https://vk.com/public209428688 https://vk.com/public209428684 https://vk.com/public209428672 https://vk.com/public209428669 https://vk.com/public209428665 https://vk.com/public209428661 https://vk.com/public209428659 https://vk.com/public209428656 https://vk.com/public209428653 https://vk.com/public209428651 https://vk.com/public209428646 https://vk.com/public209428641 https://vk.com/public209428633 https://vk.com/public209371893 https://vk.com/public209371887 https://vk.com/public209371877 https://vk.com/public209371858 https://vk.com/public209371852 https://vk.com/public209371841 https://vk.com/public209371834 https://vk.com/public209371813 https://vk.com/public209371826 https://vk.com/public209371802 https://vk.com/public209371790 https://vk.com/public209371780 https://vk.com/public209298957 https://vk.com/public209298947 https://vk.com/public209298934 https://vk.com/public209298926 https://vk.com/public209298917 https://vk.com/public209298875 https://vk.com/public209298871 https://vk.com/public209298862 https://vk.com/public209298719 https://vk.com/public209298858 https://vk.com/public209298843 https://vk.com/public209250048 https://vk.com/public209250049 https://vk.com/public209298805 https://vk.com/public209298789 https://vk.com/public209250046 https://vk.com/public209249995 https://vk.com/public209249993 https://vk.com/public209249990 https://vk.com/public209211432 https://vk.com/public209249983 https://vk.com/public209249955 https://vk.com/public209249951 https://vk.com/public209249946 https://vk.com/public209249859 https://vk.com/public209249942 https://vk.com/public209249892 https://vk.com/id691331608 https://vk.com/public209578989 https://vk.com/public209578950 https://vk.com/public209578938 https://vk.com/public209578933 https://vk.com/public209578925 https://vk.com/public209578914 https://vk.com/public209578899 https://vk.com/public209578888 https://vk.com/public209578880 https://vk.com/public209578893 https://vk.com/public209578873 https://vk.com/public209578867 https://vk.com/public209578862 https://vk.com/public209512875 https://vk.com/public209512865 https://vk.com/public209512856 https://vk.com/public209512847 https://vk.com/public209512843 https://vk.com/public209512838 https://vk.com/public209512826 https://vk.com/public209512816 https://vk.com/public209512811 https://vk.com/public209512801 https://vk.com/public209512791 https://vk.com/public209512748 https://vk.com/public209512718 https://vk.com/public209468471 https://vk.com/public209468465 https://vk.com/public209468449 https://vk.com/public209468440 https://vk.com/public209468455 https://vk.com/public209468436 https://vk.com/public209468430 https://vk.com/public209468423 https://vk.com/public209468420 https://vk.com/public209468418 https://vk.com/public209468400 https://vk.com/public209468391 https://vk.com/public209468380 https://vk.com/public209428748 https://vk.com/public209428746 https://vk.com/public209428735 https://vk.com/public209428738 https://vk.com/public209428732 https://vk.com/public209428729 https://vk.com/public209428726 https://vk.com/public209428723 https://vk.com/public209428721 https://vk.com/public209428705 https://vk.com/public209428700 https://vk.com/public209428710 https://vk.com/public209372099 https://vk.com/public209372093 https://vk.com/public209372086 https://vk.com/public209372073 https://vk.com/public209372066 https://vk.com/public209372059 https://vk.com/public209372050 https://vk.com/public209372042 https://vk.com/public209372033 https://vk.com/public209372028 https://vk.com/public209372018 https://vk.com/public209372011 https://vk.com/public209300371 https://vk.com/public209300362 https://vk.com/public209300352 https://vk.com/public209300343 https://vk.com/public209300333 https://vk.com/public209300325 https://vk.com/public209300315 https://vk.com/public209300304 https://vk.com/public209300300 https://vk.com/public209300297 https://vk.com/public209300275 https://vk.com/public209300271 https://vk.com/public209300252 https://vk.com/id691333652 https://vk.com/public209579274 https://vk.com/public209579265 https://vk.com/public209579260 https://vk.com/public209579251 https://vk.com/public209579240 https://vk.com/public209579232 https://vk.com/public209579224 https://vk.com/public209579217 https://vk.com/public209579208 https://vk.com/public209579199 https://vk.com/public209579187 https://vk.com/public209579176 https://vk.com/public209579168 https://vk.com/public209513027 https://vk.com/public209513018 https://vk.com/public209513011 https://vk.com/public209513004 https://vk.com/public209512995 https://vk.com/public209512986 https://vk.com/public209512977 https://vk.com/public209512971 https://vk.com/public209512966 https://vk.com/public209512957 https://vk.com/public209512953 https://vk.com/public209512946 https://vk.com/public209512938 https://vk.com/public209468590 https://vk.com/public209468563 https://vk.com/public209468557 https://vk.com/public209468551 https://vk.com/public209468544 https://vk.com/public209468537 https://vk.com/public209468527 https://vk.com/public209468523 https://vk.com/public209468515 https://vk.com/public209468505 https://vk.com/public209468499 https://vk.com/public209468493 https://vk.com/public209428794 https://vk.com/public209428790 https://vk.com/public209428788 https://vk.com/public209428785 https://vk.com/public209428780 https://vk.com/public209428777 https://vk.com/public209428774 https://vk.com/public209428771 https://vk.com/public209428768 https://vk.com/public209428766 https://vk.com/public209428761 https://vk.com/public209428759 https://vk.com/public209428755 https://vk.com/public209372256 https://vk.com/public209372248 https://vk.com/public209372245 https://vk.com/public209372227 https://vk.com/public209372216 https://vk.com/public209372238 https://vk.com/public209372200 https://vk.com/public209372196 https://vk.com/public209372175 https://vk.com/public209372184 https://vk.com/public209372161 https://vk.com/public209372138 https://vk.com/public209300713 https://vk.com/public209300701 https://vk.com/public209372149 https://vk.com/public209300682 https://vk.com/public209300675 https://vk.com/public209300660 https://vk.com/public209300654 https://vk.com/public209300616 https://vk.com/public209300624 https://vk.com/public209300610 https://vk.com/public209300604 https://vk.com/public209300592 https://vk.com/public209300584 https://vk.com/public209300527 https://vk.com/id691338584 https://vk.com/public209579598 https://vk.com/public209579588 https://vk.com/public209579579 https://vk.com/public209579574 https://vk.com/public209579568 https://vk.com/public209579560 https://vk.com/public209579549 https://vk.com/public209579535 https://vk.com/public209579527 https://vk.com/public209579522 https://vk.com/public209579514 https://vk.com/public209579508 https://vk.com/public209579500 https://vk.com/public209513195 https://vk.com/public209513186 https://vk.com/public209513173 https://vk.com/public209513165 https://vk.com/public209513151 https://vk.com/public209513142 https://vk.com/public209513118 https://vk.com/public209513114 https://vk.com/public209513109 https://vk.com/public209513099 https://vk.com/public209513083 https://vk.com/public209513078 https://vk.com/public209513063 https://vk.com/public209468710 https://vk.com/public209468704 https://vk.com/public209468692 https://vk.com/public209468685 https://vk.com/public209468681 https://vk.com/public209468673 https://vk.com/public209468664 https://vk.com/public209468659 https://vk.com/public209468649 https://vk.com/public209468644 https://vk.com/public209468636 https://vk.com/public209468629 https://vk.com/public209468622 https://vk.com/public209428854 https://vk.com/public209428850 https://vk.com/public209428846 https://vk.com/public209428840 https://vk.com/public209428836 https://vk.com/public209428832 https://vk.com/public209428828 https://vk.com/public209428825 https://vk.com/public209428823 https://vk.com/public209428818 https://vk.com/public209428809 https://vk.com/public209428808 https://vk.com/public209428804 https://vk.com/public209372563 https://vk.com/public209372541 https://vk.com/public209372512 https://vk.com/public209372485 https://vk.com/public209372457 https://vk.com/public209372402 https://vk.com/public209372429 https://vk.com/public209372379 https://vk.com/public209372370 https://vk.com/public209372352 https://vk.com/public209372345 https://vk.com/public209372364 https://vk.com/public209372337 https://vk.com/public209302220 https://vk.com/public209302215 https://vk.com/public209302204 https://vk.com/public209302191 https://vk.com/public209302182 https://vk.com/public209302173 https://vk.com/public209302166 https://vk.com/public209302150 https://vk.com/public209302146 https://vk.com/public209302138 https://vk.com/public209302131 https://vk.com/public209302036 https://vk.com/public209301900 https://vk.com/public209301786 https://vk.com/id691343832 https://vk.com/public209579817 https://vk.com/public209579811 https://vk.com/public209579800 https://vk.com/public209579793 https://vk.com/public209579774 https://vk.com/public209579784 https://vk.com/public209579758 https://vk.com/public209579762 https://vk.com/public209579752 https://vk.com/public209579741 https://vk.com/public209579732 https://vk.com/public209579725 https://vk.com/public209513346 https://vk.com/public209513337 https://vk.com/public209579724 https://vk.com/public209513322 https://vk.com/public209513316 https://vk.com/public209513305 https://vk.com/public209513297 https://vk.com/public209513281 https://vk.com/public209513270 https://vk.com/public209513264 https://vk.com/public209513258 https://vk.com/public209513244 https://vk.com/public209513238 https://vk.com/public209513227 https://vk.com/public209468855 https://vk.com/public209468797 https://vk.com/public209468790 https://vk.com/public209468806 https://vk.com/public209468775 https://vk.com/public209468784 https://vk.com/public209468763 https://vk.com/public209468753 https://vk.com/public209468746 https://vk.com/public209468741 https://vk.com/public209468734 https://vk.com/public209468732 https://vk.com/public209468726 https://vk.com/public209428902 https://vk.com/public209428898 https://vk.com/public209428896 https://vk.com/public209428891 https://vk.com/public209428887 https://vk.com/public209428892 https://vk.com/public209428879 https://vk.com/public209428881 https://vk.com/public209428876 https://vk.com/public209428863 https://vk.com/public209428861 https://vk.com/public209428858 https://vk.com/public209428856 https://vk.com/public209372843 https://vk.com/public209372837 https://vk.com/public209372833 https://vk.com/public209372826 https://vk.com/public209372822 https://vk.com/public209372811 https://vk.com/public209372767 https://vk.com/public209372715 https://vk.com/public209372777 https://vk.com/public209372739 https://vk.com/public209372696 https://vk.com/public209372679 https://vk.com/public209302709 https://vk.com/public209302701 https://vk.com/public209302695 https://vk.com/public209302683 https://vk.com/public209302648 https://vk.com/public209302675 https://vk.com/public209302662 https://vk.com/public209302640 https://vk.com/public209302634 https://vk.com/public209302628 https://vk.com/public209302606 https://vk.com/public209302599 https://vk.com/public209302591 https://vk.com/id691579795 https://vk.com/public209580125 https://vk.com/public209580120 https://vk.com/public209580107 https://vk.com/public209580094 https://vk.com/public209580091 https://vk.com/public209580079 https://vk.com/public209580074 https://vk.com/public209580068 https://vk.com/public209580055 https://vk.com/public209580045 https://vk.com/public209580059 https://vk.com/public209580034 https://vk.com/public209580027 https://vk.com/public209513550 https://vk.com/public209513547 https://vk.com/public209513535 https://vk.com/public209513526 https://vk.com/public209513522 https://vk.com/public209513514 https://vk.com/public209513504 https://vk.com/public209513495 https://vk.com/public209513486 https://vk.com/public209513476 https://vk.com/public209513440 https://vk.com/public209513413 https://vk.com/public209468973 https://vk.com/public209513403 https://vk.com/public209468965 https://vk.com/public209468943 https://vk.com/public209468937 https://vk.com/public209468922 https://vk.com/public209468915 https://vk.com/public209468909 https://vk.com/public209468905 https://vk.com/public209468900 https://vk.com/public209468895 https://vk.com/public209468885 https://vk.com/public209468879 https://vk.com/public209468874 https://vk.com/public209428950 https://vk.com/public209428945 https://vk.com/public209428939 https://vk.com/public209428936 https://vk.com/public209428934 https://vk.com/public209428942 https://vk.com/public209428913 https://vk.com/public209428926 https://vk.com/public209428922 https://vk.com/public209428920 https://vk.com/public209428917 https://vk.com/public209428909 https://vk.com/public209428908 https://vk.com/public209373045 https://vk.com/public209373037 https://vk.com/public209373029 https://vk.com/public209373015 https://vk.com/public209373004 https://vk.com/public209372991 https://vk.com/public209372979 https://vk.com/public209372955 https://vk.com/public209372947 https://vk.com/public209372929 https://vk.com/public209372901 https://vk.com/public209372880 https://vk.com/public209372893

Java并发-JMM的8大原子操作及并发3之volatile关键字可见性

我们之前讲解了JMM模型,以及其引入的必要行,以及JMM与JVM内存模型的比较和JMM与硬件内存结构的对应关系。

思维导图

本节主要讲解思维导图如下:

image.png

内容

1、JMM的8大原子操作

1、lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态。
2、unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量 才可以被其他线程锁定。
3、read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以 便随后的load动作使用。
4、load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的 变量副本中。
5、use(使用):作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚 拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。
6、assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收的值赋给工作内存的变量, 每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
7、store(存储):作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便随 后的write操作使用。
8、write(写入):作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中。

注意:
1、如果需要把变量总主内存赋值给工作内存:read和load必须是连续;read只是把主内存的变量值从主内存加载到工作内存中,而load是真正把工作内存的值放到工作内存的变量副本中。
2、如果需要把变量从工作内存同步回主内存;就需要执行顺序执行store跟write操作。store作用于工作内存,将工作内存变量值加载到主内存中,write是将主内存里面的值放入主内存的变量中。

代码实例:


public class VolatileTest2 {
     static boolean  flag = false;

     public void refresh(){
         this.flag = true;
         String threadName = Thread.currentThread().getName();
         System.out.println("线程: "+threadName+" 修改共享变量flag为"+flag);
     }
     public void load(){
         String threadName = Thread.currentThread().getName();
         while (!flag){

         }
         System.out.println("线程: "+threadName+" 嗅探到flag状态的改变"+" flag:"+flag);
     }
     public static void main(String[] args) {
         /**
          * 创建两个线程
          */
         VolatileTest2 obj = new VolatileTest2();
         Thread thread1 = new Thread(() -> {
             obj.refresh();
         }, "thread1");
         Thread thread2 = new Thread(() -> {
             obj.load();
         }, "thread2");

         thread2.start();
         try {
             /**
              * 确保我们线程2先执行
              */
              Thread.sleep(2000);
         }catch (Exception e){
             e.printStackTrace();
         }
         thread1.start();
     }
}

我们发现上面代码数据结果为:

线程: thread1 修改共享变量flag为true

并且主线程不会退出,说明有用户线程在runnable运行中,说明线程2一直在运行,也说明线程2获取的变量值先从主内存read到工作内存,然后load给线程2里面工作内存里面变量,然后线程2一直是从自己工作内存获取数据,并且线程2是while的空转,抢占cpu时间多,所以一直不退出。

2、基于8大原子操作程序数据加载回写流程

8大原子操作是怎样做的?变量是如何读取、如何赋值的?

image.png

上面是线程2执行后的结果;所以线程2先读取到flag=false;所以先不会退出。

接着线程1会执行修改flag的操作。将flag修改成true;
第1步:read变量到
第2步: load到工作内存里去;
第3步: use传递给执行引擎做赋值操作。
第4步: 将修改后的值assign到工作内存;这个值会从false变成true;

那么工作内存里面的新值flag=true会立马同步到主内存里面去吗?
更新后的新值不会立马同步到我们的主内存里面去,他需要等待一定的时机。时机到了之后会同步到我们的主内存中去;

同步的时候也需要分为执行两步骤:store和write操作。
但是更新到主内存为true之后,为什么我们的线程2为什么没有感知到了;原因线程2在while进行循环判断的时候,一直判断的是我们线程2自己的工作内存里面的值。执行引擎一直判断;判断的值一直是工作内存里面的值。

然后我们修改代码如下;在while循环判断里面加一个i++的话,那么我们的线程2能不能及时感知到flag变化的值呢?
image.png
因为工作内存中已经存在这个值的话,就不会从主内存去加载。

我们修改代码如下:线程3去读取主内存flag的值,因为线程3是从主内存加载的线程1已经写入的值,此时这个值是flag=true;所以ok。
image.png

然后我们加上一个同步代码快之后的效果呢?
image.png

通过上面分析,我们的线程2已经感知到了flag数据的变化。 这是什么原因呢?这里很多人都搞不明白,这里有一个很大的坑:加了同步快之后,我们的线程2就能够读取到我们线程1修改的数据,这个是为什么呢?

原因:之前我们说了,之前没有加同步代码块之前,我们程序指令一直在循环/或者一直在做i++操作。循环是空的,可以理解为其近似在自旋跑;此时此线程对cpu的使用权限是特别高的;别的线程压根就抢不到cpu的时间片。我们加了同步快之后,我们此时线程会产生阻塞(cpu的使用权限被别的线程抢去了)。产生阻塞之后会发生线程上下文切换。如下:

image.png

2、可见性

可见性: 一个线程对某个共享主内存变量进行修改之后,其他与此共享变量相关的线程会立马感知到这个数据的更改。其他线程可以看到某个线程修改后的值。
之前代码我们发现,我们两个线程一个线程1修改掉flag的值之后,线程2是load读取不到写的值的,那么为了保证线程将简单标记为变量的可见性。我们最简单的方式是使用volatile关键字进行修改这个多线程共享的变量。

public class VolatileTest2 {
     static volatile boolean  flag = false;
     public void refresh(){
         this.flag = true;
         String threadName = Thread.currentThread().getName();
         System.out.println("线程: "+threadName+" 修改共享变量flag为"+flag);
     }
     public void load(){
         String threadName = Thread.currentThread().getName();
         while (!flag){

         }
         System.out.println("线程: "+threadName+" 嗅探到flag状态的改变"+" flag:"+flag);
     }
     public static void main(String[] args) {
         /**
          * 创建两个线程
          */
         VolatileTest2 obj = new VolatileTest2();
         Thread thread1 = new Thread(() -> {
             obj.refresh();
         }, "thread1");
         Thread thread2 = new Thread(() -> {
             obj.load();
         }, "thread2");

         thread2.start();
         try {
             /**
              * 确保我们线程2先执行
              */
              Thread.sleep(2000);
         }catch (Exception e){
             e.printStackTrace();
         }
         thread1.start();
     }
}

输出结果如下:

线程: thread1 修改共享变量flag为true
线程: thread2 嗅探到flag状态的改变 flag:true

volatile底层原理
volatile是Java虚拟机提供的轻量级的同步机制
volatile语义有如下两个作用:

  • 可见性:保证被volatile修饰的共享变量对所有线程总是可见的,也就是当一个线程修改了被volatile修饰的共享变量的值,新值总是可以被其他线程立即得知。
  • 有序性:禁止指令重排序优化:内存屏障。

volatile缓存可见性实现原理:

  • JMM内存交互层面:volatile修饰的变量的read、load、use操作和assign、store、write必须是连续的,即修改后必须立即同步到主内存,使用时必须从主内存刷新,由此保证volatile可见性。
  • 底层实现:通过汇编lock前缀指令,他会锁定变量缓存行区域并写会主内存,这个操作成为“缓存锁定”,缓存一致性机制会阻止同时修改两个以上处理器缓存的内存区域数据。一个处理器的缓存回写到内存会导致其他处理器缓存失效。

汇编代码查看:

  • -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -Xcomp

image.png

缓存一致性原理再次剖析:
线程1跟线程2都已经将flag=false的值加载到各自的工作内存,此时flag的状态都是S状态(共享状态),此时线程2将修改flag的值为true时候,其状态变成了M状态,这个时候线程1所在的cpu会嗅探到flag值修改让后将flag对应的缓存行状态设置为I(无效状态),然后我们线程1需要使用的时候由于值无效,需要重新加载,此时需要重新加载的话,需要线程2将修改的值添加到主内存,然后线程1才能够加载到正确的值。

Java内存模型内存交互操作:
把一个变量从主内存中复制到工作内存中,就需要按顺序地执行read个load操作,如果把变量从工作内存中同步到主内存中,就需要按照顺序地执行 store个write操作。但是Java内存模型只要求上述操作必须按照顺序执行,而没有保证必须是连续执行的。

image.png

以上是顺序性而不是连贯的,注意read跟load必须成对出现;store跟write必须成对出现。

posted @ 2021-01-14 23:31  前所未有  阅读(671)  评论(0)    收藏  举报
http://energyfuture.wikidot.com/