关于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下用户线程通过轻量级进程与内核线程进行交互 。
其中主内存主要是指堆中实例这部分空间,工作内存则是指线程自己的栈。
之所以存在工作内存,一方面是由于性能原因(工作内存中有些值存储在寄存器或高速缓存当中)
另一方面,是提供了线程间独立内存。
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下用户线程通过轻量级进程与内核线程进行交互 。
相关文章推荐
- java.sql.Timestamp与java.util.Date的相互转换
- Java中直接输出一个类的对象
- java内存泄露
- 浅谈java中的四个核心概念
- 深入Java关键字null
- Java的位移运算巧方法
- 浅谈Java中static作用
- java Streaming!
- 深度解析Java内存的原型
- java的构造方法!
- java的感慨!
- java的技术教程!
- Eclipse常用快捷键
- Eclipse大括号换行显示
- Java线程_守护线程和用户线程
- javabean servlet jsp
- 转:SVN Eclipse插件Subclipse安装和配置
- Java 访问带有密码的 Mysql数据库
- java笔试题(引自传智播客)-算法与编程
- java笔试题(引自传智播客)-下