您的位置:首页 > 编程语言 > Java开发

关于java内存模型与java线程模型

2014-01-18 16:59 381 查看
java内存模型,分为主内存及工作内存。

其中主内存主要是指堆中实例这部分空间,工作内存则是指线程自己的栈。

之所以存在工作内存,一方面是由于性能原因(工作内存中有些值存储在寄存器或高速缓存当中)

另一方面,是提供了线程间独立内存。

java围绕着在线程需要对某个主存中的实例变量进行操作时,规定了以下八个操作:

1.lock指令,如果加了syncronized类似指令,会有,作用于主内存的实例对象上

2.将变量从主存中拷贝到工作内存中,即: read

3.将工作内存中的变量值赋值到工作内存中相应的变量,即:load

4.将工作内存中的变量给执行引擎用,即use

5.将执行引擎操作的结果赋值回工作内存中的变量,即:assign

6.将工作内存中的变量值回传到主内存当中,即:store

7.将第6步,回传到主内存的变量值赋值给主内存对象变量,即:write

8.如果有lock操作,则执行unlock

volatile变量,对应的一个线程如果修改了主存中的变量值时,对另一个线程立即可见。这个意思,其实是在线程1修改变量a后,即已经将修改后的值从工作内存赋值到了主内存的变量上,执行完上述的第7步(有lock操作,必须执行完第8步),这时线程2(之前已经将变量a拷到了自己主存对应的变量上),这时当执行use操作时,还是会从主内存中去加载变量a最新的值。

voliatile还有一个作用是,防止指令重排。

线程模型,有三种:

第一种是,用户线程(轻量级进程)和内核线程是一对一的,每个内核线程专门为对应用户线程服务,所以的用户线程创建,阻塞等操作都需要内核线程介入,即需要系统调用。从中可以发现一个是性能低,一个是由于一对一需要许多系统的资源,且内核线程是有限的。

第二种,自己实现,用户线程创建,阻塞,调度都由用户自己实现,优点是性能相对来说会比较高,缺点是实现复杂。

第三种是混合型,线程创建,销毁都是在用户态下完成,系统调用还是通过内核线程去完成。用户线程与内核线程是M:N。

java现在线程模型是基于操作系统的线程模型 。windows与linux下用户线程通过轻量级进程与内核线程进行交互 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: