注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

qus的博客

 
 
 

日志

 
 

《深入理解JAVA虚拟机》-JAVA内存模型与线程  

2013-02-13 00:07:58|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
概述:
由于计算机的运算速度和它的存储和通讯子系统的速度差距巨大,大部分时间都花在IO,网络和数据库上。为了压榨CPU的运算能力,需要并发。
另外,优秀的并发程序对于提高服务器的TPS有重要的意义。

硬件的效率和一致性
由于运算速度的差距,CPU和存储设备间加入多层的cache。同时也引入了缓存一致性的问题。
解决缓存一致性有多种读写协议,(MSI,MESI,MOSI,Synapse,Firefly和Dragon Protocol等。

《深入理解JAVA虚拟机》-JAVA内存模型与线程 - qus - qus的博客
 
另外,为了使内部运算单元能尽量利用,CPU可能会对输入代码进行乱序执行优化。

JAVA内存模型

主内存和工作内存
1.所有的变量都存储在主内存中
2.每个线程都还有自己的工作内存,拥有主内存的对象的拷贝
3.线程只能操作自己的工作内存,线程间的交互只能通过主内存通讯

勉强来说,主内存对应于JAVA的堆,工作内存对应于栈)

 《深入理解JAVA虚拟机》-JAVA内存模型与线程 - qus - qus的博客
 



内存间的交互操作

8种操作的作用场景,参考上面的图。

1.read 和load ,store和write 必须一对操作
2.不允许线程丢弃assign操作,变量在工作内存中改变后必须把变法同步回主内存
3.没有assign操作,不允许变量从工作内存同步回主内存
4.新变量只能在主内存中诞生,不允许在工作内存中直接使用一个未被初始化的变量(load或assign)
对一个变量实时use和store之前必须先执行过assign和load操作
5.一个变量同一时刻值允许一条线程lock操作,但lock操作可以多次,执行相同数量的unlock,变量才会解锁
6.lock操作会清空工作内存副本,执行引擎使用前,需要执行load或者assign操作初始化变量的值
7.没有lock操作,就不允许unlock操作。不允许unlock另一个线程变量。
8.unlock操作前必须先store,write操作

volatile变量的特殊规则
一:保证此变量对所有线程的可见性,每次use之前都必须先read和load。
要正确使用

(1)写入变量不依赖此变量的值,或者只有一个线程修改此变量

(2)变量的状态不需要与其它变量共同参与不变约束

(3)访问变量不需要加锁


二:禁止指令重排序优化
volatile的变量附近的代码不会被指令重排序打乱。
具体是在变量操作之前代码不会被打乱到操作之后,操作之后的代码不会打乱到操作之前

性能:与普通变量上在写操作可能会慢些,因为需要插入内存屏障来保证不乱序执行。
不过比sync高效很多

具体操作细节:
A:read,load和use必须一起出现。保证使用变量前必须先从主内存刷新最新的值
B:assign,store和write必须一起出现。保证改变变量的时候刷新回去主内存。
C:被volatile修饰的变量不会被指令重排序优化,保证代码的执行顺序与程序的顺序相同

原子性,可见性和有序性
原子性:6个变量操作的操作都具有原子性。lock unlock通过synchronized语法来加锁。
可见性:volatile,final和synchronized 实现变量的修改值在其它线程可见
有序性:本线程内观察所有操作都是有序的。但是由于指令重排序的优化和工作内存和主内存的同步延迟,会导致在其它线程看了不保证有序。


先行发生原则
TODO


JAVA线程
映射方式
java在win和linux上都是一对一的线程模型,一条java线程映射到一条轻量级进程

调度方法
协同式调度:进程自己放弃CPU时间
抢占式调度:系统分配时间片给进程
JAVA是后者
1.7中可能有协程(Coroutines)

状态转换

《深入理解JAVA虚拟机》-JAVA内存模型与线程 - qus - qus的博客
 
  评论这张
 
阅读(1376)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017