JVM内存结构和Java内存模型(volatile关键字保证数据同步)
2017-10-16 00:00
302 查看
摘要: JVM,Java内存模型
Java内存模型:↓↓↓↓↓↓↓
JMM,定义了一个线程对另外一个线程可见,共享变量(全局变量)存在主内存中,每个线程都有自己的局部内存,当多个线程访问共享数据时,都是先Copy一个共享数据到本地内存中,然后更新了没有及时返回到共享数据,所以就会发生线程不安全的情况。
解决方法:使用volatile关键字对变量进行控制,更新后及时返回
注意:volatile不具有原子性,只具有同步性,不能解决实际项目的需求
例子:
JVM内存结构讲的是JVM的结构,也就是堆、栈、方法区
Java内存模型不是讲的结构,通俗的讲Java内存模型就是讲多线程。↓↓↓↓↓↓↓Java内存模型:↓↓↓↓↓↓↓
JMM,定义了一个线程对另外一个线程可见,共享变量(全局变量)存在主内存中,每个线程都有自己的局部内存,当多个线程访问共享数据时,都是先Copy一个共享数据到本地内存中,然后更新了没有及时返回到共享数据,所以就会发生线程不安全的情况。
解决方法:使用volatile关键字对变量进行控制,更新后及时返回
注意:volatile不具有原子性,只具有同步性,不能解决实际项目的需求
例子:
class VoalateThread extends Thread{ //voalate关键字的使用,不加关键字线程不会结束 //不使用volatile的话线程中的flag不会变为false,本地内存是false,没有刷新到主内存中 public volatile boolean flag = true; @Override难 public void run() { System.out.println("线程执行开始..."); while(flag) { } System.out.println("线程执行结束..."); } } public class VoalateDemo { public static void main(String[] args) throws InterruptedException { VoalateThread t1 = new VoalateThread(); t1.start(); Thread.sleep(500); /* 这里将变量更改为false,逻辑上线程应该是要结束,但是就是因为main线程中的flag是局部变量,更新后没有及时返回到线程中,所以导致线程不能更新 */ t1.flag = false; System.out.println("主函数结束..."); } }
相关文章推荐
- JVM运行时内存数据区结构及内存参数
- JVM内存结构和Java数据类型
- [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义
- Java多线程-带你认识Java内存模型,内存分区,从原理剖析Volatile关键字
- JVM学习记录-JVM的内存结构管理和运行时数据区理解
- JVM内存结构、Java内存模型以及Java对象模型之间的区别
- volatile 保证变量内存中值的同步
- Java内存模型与并发同步常用的关键字(volatile和Synchronized)
- JVM内存结构——运行时数据区
- volatile关键字如何保证内存可见性
- Java同步内存模型和Volatile关键字
- JVM内存结构 VS Java内存模型 VS Java对象模型
- JVM内存结构 VS Java内存模型 VS Java对象模型
- JVM内存结构(运行时数据区)
- volatile足以保证数据同步吗
- volatile足以保证数据同步吗
- volatile关键字与Java同步内存模型
- 通过学习volatile关键字了解java内存数据访问
- volatile足以保证数据同步吗
- JVM内存结构 VS Java内存模型 VS Java对象模型