JMM & synchronized概述
根据Java语言规范中的说明,JVM系统中存在一个主内存(Main Memory),Java中所有的变量存储在主内存中,对于所有的线程是共享的(相当于黑板,其他人都可以看到的)。每个线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中变量的拷贝,(相当于自己笔记本,只能自己看到),工作内存由缓存和堆栈组成,其中缓存保存的是主存中的变量的copy,堆栈保存的是线程局部变量。线程对所有变量的操作都是在工作内存中进行的,线程之间无法直接互相访问工作内存,变量的值得变化的传递需要主存来完成。在JMM中通过并发线程修改的变量值,必须通过线程变量同步到主存后,其他线程才能访问到。
大体上来讲,线程对某个变量的操作可以简化成下面的步骤:
1.从主内存中复制数据到工作内存
2.执行代码,对数据进行各种操作和计算
3.把操作后的变量值重新写回主内存中
当然这样的运行顺序也是我们所期望的!但是, JVM并不保证第1步和第3步会严格按照上述次序立即执行。因为根据java语言规范的规定,线程的工作内存和主存间的数据交换是松耦合的,什么时候需要刷新工作内存或者什么时候更新主存的内容,可以由具体的虚拟机实现自行决定。由于JVM可以对特征代码进行调优,也就改变了某些运行步骤的次序的颠倒,那么每次线程调用变量时是直接取自己的工作存储器中的值还是先从主存储器copy再取是没有保证的,任何一种情况都可能发生。同样的,线程改变变量的值之后,是否马上写回到主存储器上也是不可保证的,也许马上写,也许过一段时间再写。那么,在多线程的应用场景下就会出现问题了,多个线程同时访问同一个代码块,很有可能某个线程已经改变了某变量的值,当然现在的改变仅仅是局限于工作内存中的改变,此时JVM并不能保证将改变后的值立马写到主内存中去,也就意味着有可能其他线程不能立马得到改变后的值,依然在旧的变量上进行各种操作和运算,最终导致不可预料的结果。
这样的情况是不是就不能避免了呢?
Java程序员都知道synchronized关键字强制实施一个互斥锁,使得被保护的代码块在同一时间只能有一个线程进入并执行。当然synchronized还有另外一个方面的作用:在线程进入synchronized块之前,会把工作存内存中的所有内容映射到主内存上,然后把工作内存清空再从主存储器上拷贝最新的值。而在线程退出synchronized块时,同样会把工作内存中的值映射到主内存,但此时并不会清空工作内存。这样一来就可以强制其按照上面的顺序运行,以保证线程在执行完代码块后,工作内存中的值和主内存中的值是一致的,保证了数据的一致性!
分享到:
- 2009-08-02 15:08
- 浏览 1662
- 评论(7)
- 论坛回复 / 浏览 (7 / 3823)
- 查看更多
相关推荐
#### 一、JAVA内存模型(JMM)概述 Java内存模型(JMM, Java Memory Model)是Java虚拟机规范的一部分,它规定了程序中各种变量(线程共享变量)的访问规则,以及在并发环境中如何解决因内存可见性问题导致的数据...
- 内存模型概述:JMM确保了多线程环境下的正确性,它规定了如何在共享内存系统中处理数据的读写。JMM允许编译器和硬件优化,但同时也引入了一些复杂性,例如数据可能在处理器缓存、寄存器或主内存之间移动。 - JSR...
- 内存模型概述:JMM描述了程序中变量的存储、读取和同步机制。它规定了当多个线程访问同一变量时,如何保证数据的正确性。JMM允许编译器和硬件对数据进行优化,但同时也提供了如`synchronized`和`volatile`等...
- 内存模型概述:JMM规定了在多线程环境下,共享变量的读写行为,以及线程之间的通信规则。它考虑到了编译器优化、处理器缓存、多核处理器等因素对内存访问的影响,确保了并发程序的正确性。 - JSR133:Java SE ...
- **内存模型概述**:JMM确保了即使在多处理器系统或存在缓存的情况下,不同线程间的通信仍然能够保持一致。编译器、运行库、处理器或缓存都可以根据JMM的规定,以特定顺序在处理器的缓存和主内存之间移动数据。...
#### Java内存模型(JMM)概述 Java作为一种高度抽象化的编程语言,致力于提供统一的内存管理模型,以便开发者能够跨平台地编写多线程程序。为此,Java引入了一个核心概念——Java内存模型(Java Memory Model, JMM...
其中,Java内存模型(Java Memory Model, JMM)是实现并发编程的关键部分之一。本文将详细介绍Java内存模型的基本概念、其重要特性和如何通过实际代码来确保并发环境下的程序正确性。 ## Java内存模型概述 Java...
项目概述 本项目旨在为Android开发者提供一个全面的面试复习计划,涵盖Java基础、JVM相关、Android基础、JetPack、Android进阶、第三方框架源码、设计模式以及算法等多个方面的知识点。通过系统性的学习和总结,...
#### 概述 在Android开发乃至整个Java编程领域,`volatile`关键字的应用非常广泛。它主要用于确保多线程环境中的数据一致性,通过控制内存可见性和禁止指令重排等机制来实现。本文将从`volatile`的基本概念出发,...
#### 一、Java线程操作概述 在现代软件开发中,多线程编程是提高程序性能和响应能力的关键技术之一。Java作为一种广泛使用的编程语言,提供了丰富的工具和机制来支持多线程环境下的程序设计。本文主要探讨Java中的...
但是,如果程序员使用了`final`或`synchronized`关键字,则JMM会确保这些变量的变化对于其他线程是可见的。 ##### 2. JSR133 JSR133(Java Specification Request 133)是一项旨在改进JMM的规范。它的目标是: - ...
14. volatile和synchronized在JMM中的作用:分析这两个关键字如何确保可见性和有序性。 六、并发设计模式 15. 生产者消费者模式:通过阻塞队列实现线程间的协同工作。 16. 状态机模式:在并发环境下管理对象状态的...
- **概述**:`java.util.concurrent.atomic`包提供了一系列原子类,如`AtomicInteger`、`AtomicLong`等,用于在无需显式同步的情况下进行安全的数值更新。 - **特点**:这些类提供原子操作,避免了使用`synchronized...
#### 一、Java并发概述 自Java诞生之初,其设计者就赋予了该语言强大的并发处理能力。Java语言内置了对线程和锁的支持,这使得开发者能够轻松地编写多线程应用程序。本文旨在帮助Java开发者深入理解并发的核心概念...
【Java 内存模型概述】 Java 内存模型(Java Memory Model,JMM)是 Java 平台规范的一部分,它定义了程序中各个线程如何访问和修改共享变量的规则,确保多线程环境下的正确性。JMM 主要是为了处理并发编程中可能...
- **特权操作**:JMM允许编译器和缓存在处理器特定的缓存和主存之间移动数据时有一定的自由度,除非显式使用`final`或`synchronized`关键字来保证可见性。 **1.2 JSR133** JSR133(Java Specification Request 133...
JMM允许编译器、运行时环境、处理器等根据需要调整内存的读写顺序,但同时提供了一些关键字如`synchronized`和`volatile`来确保必要的内存可见性和一致性。这些关键字的正确使用对于编写正确的并发程序至关重要。 #...