请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

原子性问题

int a;
volatile int b;
thread1{
a=3;
b=a;
}
thread2{
print(a,b)
}
问题一:老师,如果前提为一定是先执行了赋值线程也就是线程一然后在执行了输出线程,并且b输出时为3。这里可以保证a的值输出也为3是因为happens-before原则volatile 之前的都是可见的。如果这里b的赋值不依赖与a那么是否a的输出也会遵循happens-before原则一定会输出3呢?

问题二:问题一种如果依然遵循happens-before原则那么触发器是否就是这么实现的?背后是否可以理解为当线程最后使用了volatile变量纯赋值,那么线程之前所有的赋值不管是否是原子还是非原子操作,都已经完成了线程内存与主内存的同步。

问题三:如果前提为一定是先执行了赋值线程也就是线程一然后在执行了输出线程,但是不能保证b=a;这个的原子性但是可以保证可见性所以线程2一定可以输出a的值为3但是由于b=a;不是一个原子性操作所以不能保证b在线程2中输出为3.这样理解对吗?

正在回答 回答被采纳积分+3

1回答

悟空 2021-05-31 11:14:22
  1. 只要打印了b,就说明b赋值语句前面的已经被执行且能看到

  2. 原子性主要指的是print不是原子性的,可以看看问答区之前的提问,有类似的问题。


0 回复 有任何疑惑可以回复我~
  • 提问者 YXF_LYY #1
    老师我去了解了一下,那如果我这里先打印了b,b的输出结果不是3.a的输出结果为3.在整个打印语句中保证了他的原子性。但是b=a也不是一个原子性操作吧?a=3,b=2这种结果可能就有两种原因,一个是线程切换,只执行了a=3,还有一种不就是b=a这个不是原子性操作导致的吗?
    回复 有任何疑惑可以回复我~ 2021-05-31 13:33:17
  • 悟空 回复 提问者 YXF_LYY #2
    b=a这属于对引用的赋值,是原子性的
    回复 有任何疑惑可以回复我~ 2021-05-31 14:19:05
  • 提问者 YXF_LYY 回复 悟空 #3
    好的,明白了。谢谢老师
    回复 有任何疑惑可以回复我~ 2021-05-31 22:21:36
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信