1 / 11
文档名称:

Java线程内存模型.doc

格式:doc   大小:220KB   页数:11
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Java线程内存模型.doc

上传人:mh900965 2018/6/24 文件大小:220 KB

下载得到文件列表

Java线程内存模型.doc

相关文档

文档介绍

文档介绍:Java 线程/内存模型的缺陷和增强
Java在语言层次上实现了对线程的支持。它提供了Thread/Runnable/ThreadGroup等一系列封装的类和接口,让程序员可以高效的开发Java多线程应用。为了实现同步,Java提供了synchronize关键字以及object的wait()/notify()机制,可是在简单易用的背后,应藏着更为复杂的玄机,很多问题就是由此而起。
一、Java内存模型
在了解Java的同步秘密之前,先来看看JMM(Java Memory Model)。
Java被设计为跨平台的语言,在内存管理上,显然也要有一个统一的模型。而且Java语言最大的特点就是废除了指针,把程序员从痛苦中解脱出来,不用再考虑内存使用和管理方面的问题。
可惜世事总不尽如人意,虽然JMM设计上方便了程序员,但是它增加了虚拟机的复杂程度,而且还导致某些编程技巧在Java语言中失效。
JMM主要是为了规定了线程和内存之间的一些关系。对Java程序员来说只需负责用synchronized同步关键字,其它诸如与线程/内存之间进行数据交换/同步等繁琐工作均由虚拟机负责完成。如图1所示:根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。
图1 Java内存模型示例图
线程若要对某变量进行操作,必须经过一系列步骤:首先从主存复制/刷新数据到工作内存,然后执行代码,进行引用/赋值操作,最后把变量内容写回Main Memory。Java语言规范(JLS)中对线程和主存互操作定义了6个行为,分别为load,save,read,write,assign和use,这些操作行为具有原子性,且相互依赖,有明确的调用先后顺序。具体的描述请参见JLS第17章。
我们在前面的章节介绍了synchronized的作用,现在,从JMM的角度来重新审视synchronized关键字。
假设某条线程执行一个synchronized代码段,其间对某变量进行操作,JVM会依次执行如下动作:
(1) 获取同步对象monitor (lock)
(2) 从主存复制变量到当前工作内存(read and load)
(3) 执行代码,改变共享变量值(use and assign)
(4) 用工作内存数据刷新主存相关内容(store and write)
(5) 释放同步对象锁(unlock)
可见,synchronized的另外一个作用是保证主存内容和线程的工作内存中的数据的一致性。如果没有使用synchronized关键字,JVM不保证第2步和第4步会严格按照上述次序立即执行。因为根据JLS中的规定,线程的工作内存和主存之间的数据交换是松耦合的,什么时候需要刷新工作内存或者更新主内存内容,可以由具体的虚拟机实现自行决定。如果多个线程同时执行一段未经synchronized保护的代码段,很有可能某条线程已经改动了变量的值,但是其他线程却无法看到这个改动,依然在旧的变量值上进行运算,最终导致不可预料的运算结果。
二、DCL失效
这一节我们要讨论的是一个让Java丢脸的话题:DCL失效。在开始讨论之前,先介绍一下LazyLoad,这种技巧很常用,就是指一个类包含某个成员变量,在类初始化的时候并不立即为该变量初始化一个实例,而是等到真正要使用到该变量的时候才初始化之。
例如下面的代码:
代码1
class Foo
{
private Resource res = null;
public Resource getResource()
{
if (res == null) res = new Resource();
return res;
}
}
由于LazyLoad可以有效的减少系统资源消耗,提高程序整体的性能,所以被广泛的使用,连Java的缺省类加载器也采用这种方法来加载Java类。
在单线程环境下,一切都相安无事,但如果把上面的代码放到多线程环境下运行,那么就可能会出现问题。假设有2条线程,同时执行到了if(res == null),那么很有可能res被初始化2次,为了避免这样的Race Condition,得用synchronized关键字把上面的方法同步起来。代码如下:
代码2
Class Foo
{
Private Resource res = null;
Public sync

最近更新

2025年赣西科技职业学院单招职业技能测试模拟.. 39页

2025年赤峰工业职业技术学院单招职业技能测试.. 42页

2026年林州建筑职业技术学院单招职业适应性考.. 42页

2025年辽宁冶金职业技术学院单招综合素质考试.. 39页

2026年桂林信息工程职业学院单招职业适应性测.. 41页

2025年辽宁城市建设职业技术学院单招职业适应.. 42页

2025年辽宁师范高等专科学校单招综合素质考试.. 40页

2025年辽宁广告职业学院单招职业倾向性测试模.. 40页

2025年辽宁建筑职业学院单招职业倾向性考试模.. 40页

2025年辽宁机电职业技术学院单招职业技能考试.. 41页

2025年辽宁民族师范高等专科学校单招职业适应.. 41页

2026年民办四川天一学院单招职业技能考试题库.. 42页

2025年辽宁生态工程职业学院单招职业倾向性考.. 40页

2026年汉中职业技术学院单招职业适应性测试模.. 42页

2025年辽宁省抚顺市单招职业倾向性考试模拟测.. 41页

2025年辽宁省沈阳市单招职业倾向性考试模拟测.. 40页

2026年江苏商贸单招试题及答案1套 41页

2026年江苏旅游职业学院单招职业技能测试模拟.. 42页

2025年辽宁职业学院单招职业适应性测试模拟测.. 40页

2026年江苏省徐州市单招职业适应性考试题库附.. 40页

2026年江苏省盐城市单招职业适应性测试模拟测.. 41页

2025年辽源职业技术学院单招职业技能测试模拟.. 40页

2025年辽阳职业技术学院单招职业适应性测试模.. 40页

2026年江西信息应用职业技术学院单招职业适应.. 42页

2025年运城师范高等专科学校单招职业技能考试.. 39页

2025年通化医药健康职业学院单招职业倾向性测.. 40页

2026年江西工程学院单招综合素质考试模拟测试.. 41页

2025年遂宁能源职业学院单招综合素质考试题库.. 40页

2025年遵义医药高等专科学校单招职业技能测试.. 39页

2025年遵义师范学院单招职业适应性测试模拟测.. 41页