关注
1.原子性操作
在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。只有简单的读取、赋值(而且必须是将数字赋值给某个变量,变量之间的相互赋值不是原子操作)才是原子操作。
在32位平台下,对64位数据的读取和赋值是需要通过两个操作来完成的,不能保证其原子性。但是好像在最新的JDK中,JVM已经保证对64位数据的读取和赋值也是原子性操作了。
Java内存模型只保证了基本读取和赋值是原子性操作,如果要实现更大范围操作的原子性,可以通过synchronized和Lock来实现。由于synchronized和Lock能够保证任一时刻只有一个线程执行该代码块,那么自然就不存在原子性问题了,从而保证了原子性。
2.指令重排
一般来说,处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。
虽然处理器会对指令进行重排序,但是它会保证程序最终结果会和代码顺序执行结果相同,处理器在进行重排序时是会考虑指令之间的数据依赖性,如果一个指令Instruction 2必须用到Instruction 1的结果,那么处理器会保证Instruction 1会在Instruction 2之前执行。
虽然重排序不会影响单个线程内程序执行的结果,但是多线程呢?如果语句1和语句2没有数据依赖性,因此可能会被重排序。假如发生了重排序,在线程1执行过程中先执行语句2,而此是线程2会以为初始化工作已经完成,那么就会跳出while循环,去执行doSomethingwithconfig(context)方法,而此时context并没有被初始化,就会导致程序出错。
从上面可以看出,指令重排序不会影响单个线程的执行,但是会影响到线程并发执行的正确性。
查看原帖
1 评论
相关推荐
查看21道真题和解析 点赞 评论 收藏
分享
查看21道真题和解析 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# AI替代不了什么? #
986次浏览 34人参与
# 发工资后,你做的第一件事是什么 #
100210次浏览 332人参与
# 厦门银行科技岗值不值得投 #
16457次浏览 404人参与
# 烂工作和没工作哪个更痛苦? #
960次浏览 34人参与
# 牛油的搬砖plog #
189111次浏览 1267人参与
# 学历VS实习,哪个更重要? #
7404次浏览 119人参与
# 工作上你捅过哪些篓子? #
69160次浏览 333人参与
# 产品人求职现状 #
361144次浏览 2601人参与
# 一人分享一道面试手撕题 #
113186次浏览 2779人参与
# 春招至今,你收到几个面试了? #
3630次浏览 24人参与
# uu们,春招你还来吗? #
68922次浏览 906人参与
# 面试中,你被问过哪些奇葩问题? #
99157次浏览 1413人参与
# 面试紧张时你会有什么表现? #
35576次浏览 241人参与
# 实习生应该准时下班吗 #
349183次浏览 1752人参与
# 你的实习什么时候入职 #
368114次浏览 2367人参与
# 牛友的志愿填报指南 #
63841次浏览 491人参与
# 关于春招你都做了哪些准备? #
145851次浏览 769人参与
# 机械校招之路总结 #
120248次浏览 2083人参与
# 90后北漂现状 #
36304次浏览 215人参与
# 网申一定要掌握的小技巧 #
20696次浏览 87人参与
# 机械人,签完三方你在忙什么? #
84287次浏览 267人参与

