杭州百度seo,宁波seo关键词优化设计,品牌建设的概念,大冶网站开发文章目录 1、Java内存模型2、JMM的核心概念1#xff09;主内存与工作内存2#xff09;内存可见性3#xff09;JMM的三大特性#xff1a;原子性、可见性、有序性。 3、JMM中的八种操作4、Happens-before 规则5、样例#xff1a; 1、Java内存模型
Java内存模型#xff08;… 文章目录 1、Java内存模型2、JMM的核心概念1主内存与工作内存2内存可见性3JMM的三大特性原子性、可见性、有序性。 3、JMM中的八种操作4、Happens-before 规则5、样例 1、Java内存模型
Java内存模型Java Memory ModelJMM是一种抽象的概念用于定义多线程程序如何与内存进行交互。JMM并不真实存在它是一种规范规定了程序中变量在内存中的访问方式。 计算机在执行程序时每条指令都是在CPU中执行的。而执行指令的过程中势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存物理内存当中的这时就存在一个问题由于CPU执行速度很快而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多硬盘 内存 缓存cache CPU。因此如果任何时候对数据的操作都要通过和内存的交互来进行会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。也就是当程序在运行过程中会将运算需要的数据从主存复制一份到CPU的高速缓存当中那么CPU进行计算时就可以直接从它的高速缓存中读取数据或向其写入数据了。当运算结束之后再将高速缓存中的数据刷新到主存当中。 2、JMM的核心概念
1主内存与工作内存
主内存所有变量都存储在主内存中主内存是共享的。工作内存每个线程都有自己的工作内存工作内存中保存了主内存中变量的副本。线程对变量的所有操作读取、写入都在工作内存中进行最后再将结果同步回主内存。
2内存可见性
JMM规定了线程对变量的读取和写入顺序确保变量的修改在其他线程中可见。即当一个线程修改了变量的值其他线程最终能看到这个修改后的值。
3JMM的三大特性原子性、可见性、有序性。 原子性 一个或多个操作要么全部执行要么全部不执行执行的过程中是不会被任何因素打断的。 可见性 一个线程对共享变量的修改能够被其他线程看到。通过 volatile 关键字、锁如 synchronized来实现可见性。 程序的执行在实际运行时可能会被重排序但JMM提供了一定的保证使得某些操作在多线程环境中会按照程序的顺序执行。
3、JMM中的八种操作
JMM抽象了线程和主内存之间的关系定义了以下八种操作来完成主内存和工作内存之间的交互
• lock锁定作用于主内存的变量把一个变量标识为一条线程独占状态。
• unlock解锁作用于主内存变量把一个处于锁定状态的变量释放出来释放后的变量才可以被其他线程锁定。
• read读取作用于主内存变量把一个变量值从主内存传输到线程的工作内存中以便随后的load动作使用。
• load载入作用于工作内存的变量它把read操作从主内存中得到的变量值放入工作内存的变量副本中。
• use使用作用于工作内存的变量把工作内存中的一个变量值传递给执行引擎每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。
• assign赋值作用于工作内存的变量它把一个从执行引擎接收到的值赋值给工作内存的变量每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
• store存储作用于工作内存的变量把工作内存中的一个变量的值传送到主内存中以便随后的write的操作。
• write写入作用于主内存的变量它把store操作从工作内存中一个变量的值传送到主内存的变量中。 4、Happens-before 规则
JMM还定义了一个重要的概念happens-before它是判断数据是否存在竞争、线程是否安全的依据。happens-before原则规定了以下几种情况
• 程序次序规则一个线程中的每个操作happens-before于该线程中的任意后续操作。
• 监视器锁规则对一个锁的解锁happens-before于随后对这个锁的加锁。
• volatile变量规则对一个volatile域的写happens-before于任意后续对这个volatile域的读。
• 传递性如果A happens-before B且B happens-before C那么A happens-before C。
• start()规则如果线程A执行操作ThreadB.start()启动线程B那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。
• join()规则如果线程A执行操作ThreadB.join()并成功返回那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。
• 中断规则对线程interrupt()方法的调用happens-before于被中断线程的代码检测到中断事件的发生。
• 终结器规则对象的构造函数执行、结束happens-before于它的finalize()方法的开始。 JMM定义了一组 happens-before 规则用来确定操作之间的顺序确保内存可见性和有序性 5、样例
public class VolatileExample {private volatile boolean flag false;public void writer() {flag true; // 写操作保证对其他线程可见}public void reader() {if (flag) { // 读操作确保读取到最新值System.out.println(Flag is true);}}
}public class SynchronizedExample {private int count 0;public synchronized void increment() {count; // synchronized 确保可见性和原子性}public synchronized int getCount() {return count; // synchronized 确保读取最新值}
}
在 VolatileExample 中flag 变量使用 volatile 修饰确保在一个线程修改 flag 后其他线程能够立即看到变化。在 SynchronizedExample 中increment 和 getCount 方法使用 synchronized 修饰确保操作的可见性和原子性。