网站建设完成阶段性总结报告,网上银行登录,长沙做一个网站多少钱,招生门户网站建设方案一、什么是JMM#xff1f; JMM指的是Java内存模型#xff0c;即 Java Memory Model Java内存模型并不是一种实际存在的东西#xff0c;而是一种人为形成的约定#xff0c;是一种概念。 关于JMM#xff0c;我们需要了解一些相关的同步约定 #xff1a;
线程在解锁前 JMM指的是Java内存模型即 Java Memory Model Java内存模型并不是一种实际存在的东西而是一种人为形成的约定是一种概念。 关于JMM我们需要了解一些相关的同步约定
线程在解锁前必须将线程中的工作内存中存储的值即时刷新到主内存中的共享变量线程在加锁前必须读取主存中的最新值到工作内存中加锁和解锁是同一把锁
线程中操作的数据要从主内存中读取并备份到线程自己的工作内存中作为副本主存并不会主动向线程更新数据。
线程的八种内存交互操作
lock锁定作用于主内存的变量把一个变量标识为线程独占状态unlock解锁 作用于主内存的变量把一个处于锁定状态的共享变量释放read读取作用于主内存的变量把一个变量的值从主内存传输到线程的工作内存中load加载作用于工作内存的变量把通过read操作获取的变量值放入工作内存中use使用作用于工作内存的变量把工作内存中的变量传输给执行引擎每当虚拟机遇到需要使用到变量的值就会使用到这个指令assign赋值作用于工作内存的变量把执行引擎传输过来的值放入工作内存store存储作用于主内存的变量把一个从线程中的工作内存的变量值传送到主内存中以便后续的write操作write写入作用于主内存的变量将store操作从工作内存获取的变量值放入主内存中
JMM对以上八种内存操作指令做出了如下约束 read和load、user和assign、store和write、lock和unlock必须成对出现不允许单独操作其中一条指令不允许线程丢弃离它最近的assign操作即工作内存中的变量值改变之后必须告知主内存不允许一个线程将没有assign过的数据从工作内存同步会主内存一个新的变量必须在主内存中产生不允许工作内存私自初始化一个变量来作为共享变量即实施use和 store操作之前 必须经过 load 和assign操作同一变量同一时间只允许一个线程对其进行lock操作多次lock之后必须执行相同次数的unlock对其解锁如果对一个变量进行lock操作会清空所有工作内存中此变量的值 即每次获得锁的线程加锁前必须要重新读取主内存中的变量值才能提交给执行引擎进行use操作如果一个变量没有被lock就不能对其进行unlock操作也不能对一个被其他线程锁住的变量进行unlock对一个变量加锁之前必须把工作内存中的变量值同步回主内存 存在问题
假设现在有一个main线程和一个普通线程普通线程执行的操作是当num为 0 时 一直循环下去此时main线程给num赋值为 1 普通线程并不知道num已经被修改程序就会一直执行不会停止
public class VolatileDemo {private static int num 0;public static void main(String[] args) {new Thread(()-{ // 线程1while (num 0) {}}).start();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}num 1;System.out.println(num);}
}
解决方法 volatile 关键字 什么是volatile ? volatile 是一种轻量级的同步机制相对于synchronized来说 保证可见性 JMM 主内存中的共享变量修改之后会通知所有线程备份到各自的工作内存中 不保证原子性 禁止指令重排
最后祝大家早日学有所成拿到满意offer