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

来源:13-4 适用场合2

JF1sh

2020-05-22

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;
        }
    }
}

}

写回答

1回答

悟空

2020-05-22

因为a是非线程安全的

0
3
JF1sh
回复
悟空
好的 谢谢老师
2020-05-22
共3条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程