1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Java JMM 和可见性问题

Java JMM 和可见性问题

时间:2021-01-28 02:41:21

相关推荐

Java JMM 和可见性问题

目录

1. JMM2. 可见性问题

1. JMM

为了能够支持多线程程序,又设计了 JMM(Java Memory Model,即 Java 的内存模型),是 JVM 使用的一种内存模型,是 JVM 的另一种抽象表现形式,它将线程堆栈和堆之间的内存分开;JMM 图解:

运行在 JVM 上的每个线程都有自己的线程堆栈(Thread Stack),一个线程只能访问它自己的线程堆栈,一个线程可能会将一个有限变量的副本传递给另一个线程,但它不能共享原始局部变量本身;堆(Heap)包含在 Java 应用程序中创建的所有对象,并且可以被具有对象引用的所有线程访问,如果两个线程同时调用同一个对象上的一个方法,它们都可以访问该对象的成员变量,但每个线程都有自己的局部变量副本,堆中的数据是共享的,线程不安全的;

2. 可见性问题

JMM 的两个关键概念:可见性(Visibility)和可排序性(Ordering),排序性问题出现概率极低,一般都是考虑可见性问题;共享对象的可见性是指如果两个或多个线程共享一个对象,但没有正确使用 volatile 声明或 Synchronized 同步机制,那么当一个线程更新了共享变量值后,该过程对于其他线程来讲是不可见的,例如,线程 A、B 要同时进行修改变量 c,线程 A 和 B 在各自的 Thread Stack 中维护了一份局部变量 c 的副本,线程 A 修改了线程 A 中 Thread Stack 中的局部变量 c A c_A cA​,但是还没有还没将修改的数据刷新到 Heap Memory 中,而线程 B 获取的值依然是 c 的旧值,就出现了可见性问题,详见:Java 高并发及线程安全; 可以使用 volatile 关键字的方式解决(乐观锁),详见:Java 关键字 volatile;使用 synchronized 同步机制(悲观锁),详见:Java synchronized 线程的同步;其他方式,如 JDK 的并发包里提供的几个非常有用的并发容器和并发工具类,详见:Java 并发包;

推荐阅读:JVM 组成部分 >>>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。