锁定老帖子 主题:线程安全总结(二)
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-11-11
最后修改:2010-11-11
关于线程安全总结(-)请看http://www.iteye.com/topic/806990 ,发该贴后,很多朋友都发站内消息问我一些问题,我把回复整理成一篇帖子。敬请高人手下留情,小可谢过了。
站内很多人都问我,所谓线程的“工作内存”到底是个什么东西?有的人认为是线程的栈,其实这种理解是不正确的。看看JLS(java语言规范)对线程工作 内存的描述,线程的working memory只是cpu的寄存器和高速缓存的抽象描述。
可能 很多人都觉得莫名其妙,说JVM的内存模型,怎么会扯到cpu上去呢?在此,我认为很有必要阐述下,免 得很多人看得不明不白的。先抛开java虚拟机不谈,我们都知道,现在的计算机,cpu在计算的时候,并不总是从内存读取数据,它的数据读取顺序优先级 是:寄存器-高速缓存-内存。线程耗费的是CPU,线程计算的时候,原始的数据来自内存,在计算过程中,有些数据可能被频繁读取,这些数据被存储在寄存器 和高速缓存中,当线程计算完后,这些缓存的数据在适当的时候应该写回内存。当个多个线程同时读写某个内存数据时,就会产生多线程并发问题,涉及到三个特 性:原子性,有序性,可见性。在《线程安全总结》这篇文章中,为了理解方便,我把原子性和有序性统一叫做“多线程执行有序性”。支持多线程的平台都会面临 这种问题,运行在多线程平台上支持多线程的语言应该提供解决该问题的方案。
那么,我们看看JVM,JVM是一个虚拟 的计算机,它也会面临多线程并发问题,java程序运行在java虚拟机平台上,java程序员不可能直接去控制底层线程对寄存器高速缓存内存之间的同 步,那么java从语法层面,应该给开发人员提供一种解决方案,这个方案就是诸如 synchronized, volatile,锁机制(如同步块,就绪队 列,阻塞队列)等等。这些方案只是语法层面的,但我们要从本质上去理解它,不能仅仅知道一个 synchronized 可以保证同步就完了。 在这里我说的是jvm的内存模型,是动态的,面向多线程并发的,沿袭JSL的“working memory”的说法,只是不想牵扯到太多底层细节,因为 《线程安全总结》这篇文章意在说明怎样从语法层面去理解java的线程同步,知道各个关键字的使用场 景。
今天有人问我,那java的线程不是有栈吗?难道栈不是工作内存吗?工作内存这四个字得放到具体的场景 中描述,方能体现它具体的意义,在描述JVM的线程同步时,工作内存指的是寄存器和告诉缓存的抽象描述,具体请自行参阅JLS。上面讲的都是动态的内存模 型,甚至已经超越了JVM的范围,那么JVM的内存静态存储是怎么划分的?今天还有人问我,jvm的内存模型不是有eden区吗?也不见你提起。我跟他 说,这是两个角度去看的,甚至是两个不同的范围,动态的线程同步的内存模型,涵盖了cpu,寄存器,高速缓存,内存;JVM的静态内存储模型只是一种对内 存的物理划分而已,它只局限在内存,而且只局限在JVM的内存。那些什么线程栈,eden区都仅仅在JVM内存。
说说JVM的线程栈和有个朋友反复跟我纠结的eden区吧。JVM的内存,被划分了很多的区域: 1.程序计数器
关于垃圾收集,在此不多说,流到垃圾收集那一章再详细说吧。关于java的同步,其实还有基于CPU原语的比较并交换的非阻塞算法(CAS),不过这个在java的并发包里已经实现了很多,因此关于这点,就留到java并发包那一章介绍吧。后面我会专门写一篇文章,JVM内存与垃圾收集。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-11-11
楼主从哪知道这么多的呢 ?
|
|
返回顶楼 | |
发表时间:2010-11-11
ynb007 写道 楼主从哪知道这么多的呢 ?
多学习 |
|
返回顶楼 | |
发表时间:2010-11-11
看完楼主的线程安全总结(二),才对线程安全(一)的疑惑解开了
多谢楼主! |
|
返回顶楼 | |
发表时间:2010-11-11
mtnt2008 写道 看完楼主的线程安全总结(二),才对线程安全(一)的疑惑解开了
多谢楼主! 多谢鼓励 |
|
返回顶楼 | |
发表时间:2010-11-11
期待楼主其他文章
|
|
返回顶楼 | |
发表时间:2010-11-11
楼主说的jvm内存分区是参考深入java虚拟机中的吧?呵呵,关于jvm垃圾收集的这段话,如出一辙啊。也说明了楼主的功力深厚啊,赞一个。期待楼主后续文章
|
|
返回顶楼 | |
发表时间:2010-11-11
最后修改:2010-11-11
superheizai 写道 楼主说的jvm内存分区是参考深入java虚拟机中的吧?呵呵,关于jvm垃圾收集的这段话,如出一辙啊。也说明了楼主的功力深厚啊,赞一个。期待楼主后续文章
是的,内存分区这段不是帖子重点,我不想说的太详细,那样要写很长,又是另外一个话题。 |
|
返回顶楼 | |
发表时间:2010-11-11
小弟我没接触过多线程,不知道这线程用在什么地方?或者说项目中那个地方可能会用到线程?
这年头,楼主能把知识分享给大伙,好啊。 |
|
返回顶楼 | |
发表时间:2010-11-11
写的确实不错 不过只要每个人勤奋一点 多看点书 这些东西都有的 哈哈
|
|
返回顶楼 | |