宜章网站建设,河南建设工程信息网官网洛阳至信阳省道,响应式环保网站模板,平面设计公司简介模板在java中#xff0c;设计之初就有了#xff1a;主内存、线程工作内存#xff0c;所以其实每一个线程执行时#xff0c;都是将主线程copy一份到工作线程#xff0c;执行修改后#xff0c;再同步回去。 所以#xff0c;就有四组内存操作方式#xff1a; 1、读主内存…在java中设计之初就有了主内存、线程工作内存所以其实每一个线程执行时都是将主线程copy一份到工作线程执行修改后再同步回去。 所以就有四组内存操作方式 1、读主内存加载到工作内存 2、 通过执行引擎使用工作内存数据、修改工作内存 3、读工作内存、写到主内存 4、使用内存时会加锁解锁 volatile可以让多个线程可见或者说不再操作工作内存 package com.quxiao.controller;import java.sql.Time;
import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.*;
import java.util.stream.LongStream;/*** program: package1* author: quxiao* create: 2023-09-27 15:22**/
public class t3 {static volatile int sum 0;public static void main(String[] args) throws InterruptedException {new Thread(() - {while (sum 0) {}System.out.println(1);}).start();TimeUnit.SECONDS.sleep(1);sum 1;}
}但是使用了volatile就没有了原子性也就是线程操作不再唯一例如 A线程取出时为10正准备10数据变成了15结果就成了1510。 指令重排很神奇的一个东西 package com.quxiao.controller;import java.sql.Time;
import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.*;
import java.util.stream.LongStream;/*** program: package1* author: quxiao* create: 2023-09-27 15:22**/
public class t3 {static int x 0;static int y 0;static int a 0;static int b 0;public static void main(String[] args) throws InterruptedException {//大致如此但是new Thread(() - {x a;b 1;}).start();new Thread(() - {y b;a 2;}).start();//有可能x2,y1System.out.println(x : y);}
}xb和a1这两句话完全没有关联编译器就有可能把他俩重新排顺序。上面的代码只是理论其实很难遇到 加上volatile就能解决多了两层内存屏障