请稍等 ...
×

采纳答案成功!

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

正在回答

2回答

悟空 2019-11-21 15:34:39

这里的this是代表“本对象”,在本例中起到锁对象的作用

0 回复 有任何疑惑可以回复我~
  • 提问者 ych_1997 #1
    第二个synchronized为什么是锁住 int aa =a;
    我的想法是 ,第二个 synchronized 改成
    synchronized (this) {
        int dd = d;
        int cc = c;
        int bb = b;
        int aa = a;
    }
    这么改的想法是,既然线程A把 d 作为内存屏障的终点,那么线程B就应该首先找到内存屏障的终点 d,保证 c b a 都来自同一批“以d为终点的”赋值操作。
    回复 有任何疑惑可以回复我~ 2019-11-21 15:36:09
  • 悟空 #2
    线程2不需要一定要d作为起点,只要进入了同步块,都是可见的。
    回复 有任何疑惑可以回复我~ 2019-11-21 18:51:54
  • 悟空 #3
    这里是触发器,不是强同步。不过这里不需要纠结,只要理解前面的volatile的触发器就可以了。
    回复 有任何疑惑可以回复我~ 2019-11-21 18:52:40
稀溜溜 2020-03-21 09:47:17

我把synchronized当做volatile来理解,修改成以下代码,跑了一晚上也没有出现b=3;a=1的情况,

这样理解对吧

int a = 1;
int b = 2;

public void change() {
   a = 3;
   synchronized (this) {
       b = a;
   }
}

0 回复 有任何疑惑可以回复我~
  • 悟空 #1
    恩对的
    回复 有任何疑惑可以回复我~ 2020-03-21 12:09:37
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信