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

本文介绍了Java内存模型,包括主内存与工作内存的概念及其作用。详细解释了在线程操作实例变量时涉及的八种基本操作,并阐述了volatile变量的作用。此外,还探讨了Java中的三种线程模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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下用户线程通过轻量级进程与内核线程进行交互 。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值