关注
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 评论
相关推荐
点赞 评论 收藏
转发
点赞 评论 收藏
转发
03-20 10:28
Northwestern University 机械类 点赞 评论 收藏
转发
牛客热帖
正在热议
# 牛客帮帮团来啦!有问必答 #
381973次浏览 7619人参与
# 应届生初入职场,求建议 #
21935次浏览 537人参与
# 晒一晒我的offer #
2799111次浏览 49733人参与
# 在国企工作的人,躺平了吗? #
71595次浏览 868人参与
# 简历中的项目经历要怎么写 #
378187次浏览 6358人参与
# 非技术岗薪资爆料 #
6873次浏览 135人参与
# 你更愿意参加线上面试还是线下面试? #
6453次浏览 90人参与
# 非技术薪资爆料 #
63678次浏览 954人参与
# 华为求职进展汇总 #
438655次浏览 4411人参与
# 第一次面试 #
15668次浏览 239人参与
# 租房前辈的忠告 #
20736次浏览 1646人参与
# 应届生应该先就业还是先择业 #
12087次浏览 114人参与
# 安利/避雷我的岗位 #
122243次浏览 2752人参与
# 来聊聊机械薪资天花板是哪家 #
20760次浏览 164人参与
# 机械人怎么评价今年的华为 #
53973次浏览 442人参与
# 谈薪时HR压价该怎么应对 #
33014次浏览 204人参与
# 通信硬件薪资爆料 #
145007次浏览 1078人参与
# 毕业租房也有小确幸 #
19791次浏览 1248人参与
# 数据人offer决赛圈怎么选 #
36604次浏览 658人参与
# 正在实习的你,有转正机会吗? #
83200次浏览 865人参与