一小段代码的执行结果求解释

图片说明

想问下这段java代码要如何解释a的输出结果为1,这里我想过其实有两种可能性

  • 一种是thread1中的 a = 2 和sout("thread1结束了")执行顺序互换了,但是volatitle关键字修饰的a具有有序性,所以应该是不可能的

  • 第二种是a的值读的是旧缓存的值,但volatitle关键值使得a具有可见性,而sout又是加了锁的,所以在thread1里的sout("thread1结束了")执行时加了锁,而这时a又变成了2,这时锁释放,再执行thread里的sout(a),所以也应该时显示为2才对

除此之外没有想到其他可能性了,本人对并发编程这块不是很精通,所以想问下各位大佬对此有何见解

https://blog.csdn.net/lhjtianji/article/details/6927359

https://blog.csdn.net/ideaxx/article/details/89421200

看你的打印我也是觉得是2,然后就自己写了试试。我想知道我的代码和你的有什么区别,我执行很多次都是 a=2

public class Test {

    volatile static int a  = 1;

    public static void main(String[] args){
        Thread t1 = new Thread(() ->{
            a = 2;
            System.out.println("t1 ok");
        });

        Thread t2 = new Thread(() ->{
            System.out.println(a);
            System.out.println("t2 ok");
        });

        t1.start();
        t2.start();
    }
}