牛客999991342号 level
获赞
2530
粉丝
1435
关注
185
看过 TA
422
外交学院
2020
运营
IP属地:未知
暂未填写个人简介
私信
关注
2020-04-29 17:39
外交学院 运营
0 点赞 评论 收藏
分享
2020-04-28 11:27
已编辑
外交学院 运营
问题描述:    原子指令重排的底层原理是什么?       回答有奖:  选取一位认真回答问题的牛友,赠送200牛币!   ▶回答尽量有自己的思考,不要单纯的只是复制粘贴定理定义,或者他人blog哦~   Tips.牛币兑换中心      你问我答问题汇总:点击进入   关注你问我答栏目:点击关注       你问我答 - 答问题,成大佬,拿牛币!   你问我答是牛客新栏目,每周1期几个面试中真实遇到的问题,   牛友在问题贴下留下自己的知识,经验与见解,   帮助更多牛友了解更多技术相关知识!
又戈月空: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并没有被初始化,就会导致程序出错。 从上面可以看出,指令重排序不会影响单个线程的执行,但是会影响到线程并发执行的正确性。
0 点赞 评论 收藏
分享
2020-04-24 15:06
外交学院 运营
0 点赞 评论 收藏
分享
2020-04-26 10:49
已编辑
外交学院 运营
本周话题   这个五一你有什么计划?    注:只有在本帖下留言的牛友才可参与抽奖哦~    参与有奖     分享你的感受,将于4月30日抽奖送出【牛客U型枕】~  抽出5位(以id计,重复分享以第1次回帖为准)认真分享的牛友每人送出1个U型枕~           欢迎所有已经参与工作的牛友加入牛客【社畜职场划水群】!   扫码加牛可乐,回复关键词【我要划水】进群~          寻找社招机会 / 发社招内推的小伙伴也可以加牛可乐哦~      ----------------------     职场经验征集,送卫衣,京东卡:点击参与  社招面经征集,送卫衣,京东卡:点击参与    ...
树街猫o(=•ェ•=...:迷茫的应届生,论文还差好多好多字数,呆家里写论文吧,顺便复习基础知识,好好找工作,远程面试很忧伤,当然0offer更忧伤,忧伤的心啊啊,靓仔落泪啊。五一放假就跟没放一样,区别不大,呆在家里久了,感觉没有读书的快乐了,甚至都遗忘了上学的感觉。就像一首歌唱的:我的青春小鸟一去不回来 我的青春小鸟一去不回来
0 点赞 评论 收藏
分享

创作者周榜

更多
关注他的用户也关注了:
牛客网
牛客网在线编程
牛客网题解
牛客企业服务