高性能编程之线程安全(可见性,原子性)

2 篇文章 0 订阅
2 篇文章 0 订阅

java内存模型 VS jvm运行时数据区

在这里插入图片描述

java内存模型:
是由《java语言规范》提出来的,用来描述java语言的特性,实际上java内存模型是描述java多线程程序在执行时的一些规则。
jvm运行时数据区:
由《java虚拟机规范》提出来的,用来描述虚拟机在内存中应该遵循什么样的特点。
总结:

java语言规范 只是提出规则,具体需要 jvm规范 去解决。

JIT编译器(Just In Time Compiler)

首先清楚脚本语言与编译语言的区别:
在这里插入图片描述

共同点:
 都需要编译成机器码给机器执行。
区别:
(一条一条)脚本语言:

解释执行 在执行时由语言的解释器将代码一条一条翻译成机器可以识别的指令。

(批量编译)编译语言:

编译执行 将我们编写的代码批量编译成机器码,拿机器码去执行,需注意***字节码并不是机器码,它只是把java代码用另外一种形式进行了描述。 ***

java语言既是脚本语言,也是编译语言,是二者的结合体。
不同版本的jdk,以及不同的参数设置,是jit编译器优化处理的方式不一样。

volatile 关键字

可见性问题 : 让一个线程对共享变量的修改,能够及时被其他线程看到。

java内存模型规定:对于volatile修饰的变量的修改,与其他线程后续对这个变量的读取是同步的,也就是说一个线程修改了,其余线程可以马上知道。

volatile 关键字的作用:
1、禁止缓存(class文件中会加一个访问控制符ACC_VOLATILE,标志JIT编译器不允许进行优化缓存)。
2、对于volatile修饰的变量JIT编译器不允许进行指令重排。

java内存模型

Shared Variables 定义:

可以在线程之间共享的内存,称为共享内存或者堆内存
所有的对象字段,静态字段,数组元素,都储存在堆内存中(堆,方法区)这些字段都是共享变量
冲突 : 假如俩个线程对一个共享变量操作,俩个操作都是读,则没有冲突,如果其中有一个是写操作,那么就会发生冲突,线程的可见性问题(eg: t1写了t2没有读到);

线程间操作的定义

1、线程间操作:指一个程序执行的操作可以被其他线程感知 或者被其他线程影响。(读写就是列子,俩个都是读则没有影响,其中一个操作是写那么就会影响到另外一个操作的结果,或者说会被另外一个操作感知到)。
2、java内存模型只会描述线程之间的操作(2个以上线程),并不关心线程内操作。

在这里插入图片描述在这里插入图片描述

java内存模型描述的是,当我们在对共享变量进行线程间操作的时候出现的一些问题而定的一些规则。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值