请稍等 ...
×

采纳答案成功!

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

悟空老师:请问一下 volatile作为触发器,这种情况为什么不能实现 b=20000

public class Visibility1 implements Runnable {
int b;
volatile int a;
AtomicInteger realA = new AtomicInteger();

@Override
public void run() {
    for (int i = 0; i < 10000; i++) {
        b++;
        realA.incrementAndGet(); 
        a = 0;

    }
}

public static void main(String[] args) throws InterruptedException {
    for (; ; ) {
        Runnable visibility1 = new Visibility1();
        Thread t1 = new Thread(visibility1);
        Thread t2 = new Thread(visibility1);
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        if (((Visibility1) visibility1).a == 0) {
            System.out.println(((Visibility1) visibility1).b);
            System.out.println(((Visibility1) visibility1).realA);
        }
        if (((Visibility1) visibility1).a != 20000) {
            break;
        }
    }
}

}

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

1回答

悟空 2020-05-22 00:57:21

因为a是非线程安全的

0 回复 有任何疑惑可以回复我~
  • 提问者 JF1sh #1
    悟空老师,我是不是可以这样理解,a要作为触发器生效,需要两个线程,一个读 一个写。
    回复 有任何疑惑可以回复我~ 2020-05-22 09:55:16
  • 悟空 回复 提问者 JF1sh #2
    恩,这样的话就可以应用happens-before关系规则
    回复 有任何疑惑可以回复我~ 2020-05-22 10:01:25
  • 提问者 JF1sh 回复 悟空 #3
    好的 谢谢老师
    回复 有任何疑惑可以回复我~ 2020-05-22 11:05:33
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信