请稍等 ...
×

采纳答案成功!

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

老师,有个点疑惑

就是假设从0开始,线程1和线程2都在等待,然后经过栅栏,一起执行index++,

  1. 那此时假设没有冲突,线程1将index值变成1, 而线程2 将index变成了2;
    然后一起等待,经过栅栏后来到 synchronized代码块; 那按老师说的一种情况就是,线程2先进入synchronized代码块,此时线程2知道index值为2, 线程2 执行完退出,释放锁,
    由于可见性原因,线程1能看到线程2操作的东西,那么当然知道index值是为2!
  2. 老师,假设这里反过来,线程1先进入了synchronized代码块, 此时线程2如果还没来得及将index值刷新到主内存中,线程1是不是还是访问自己内存中的值,index值为1,是这样吗?
    那如果是这样的话,感觉后面结果就有错了!所以感觉自己想的有问题…

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

1回答

提问者 奶茶三兄弟d 2020-02-06 14:49:13

哦~,老师,我理解的可见性有问题~  因为index是共享变量,所以即便是线程1先进入synchronized代码快,由于可见性,所以的话,线程1能知道线程2操作的结果,就是index的值已经是2了, 应该是这样吧~

0 回复 有任何疑惑可以回复我~
  • 悟空 #1
    恩对的
    回复 有任何疑惑可以回复我~ 2020-02-06 15:28:03
  • MarcoLiLiLi 回复 悟空 #2
    悟空老师, 我对可见性的理解还不是很透彻(还没看到后面的课程)。根据这节课的例子, 因为有栅栏,所以两个线程进入synchronized块之前都进行了index++,而由于这两个线程共享index这个变量,所以好像不用可见性,两个线程在index++后也能知道index最新的值吧? 因此,无论谁先进入synchronized块,这个index最新值在进入synchronized块之前都已经对两个线程可见了吧?不知道这样理解有什么问题没有,还望悟空老师指教,谢谢。
    回复 有任何疑惑可以回复我~ 2020-03-31 13:09:43
  • 悟空 回复 MarcoLiLiLi #3
    要不你先把JMM相关的内容看完?后面具体讲了可见性
    回复 有任何疑惑可以回复我~ 2020-03-31 14:28:58
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信