这个地方为什么我执行的结果一直是有序的呢?

来源:3-3 线程安全性-原子性-synchronized

星星993

2018-07-18

http://img.mukewang.com/szimg/5b4f43ee0001811117020542.jpg

http://img.mukewang.com/szimg/5b4f444100019eb711960724.jpg

http://img.mukewang.com/szimg/5b4f44200001d62d14300170.jpg

写回答

3回答

南国漂泊

2018-08-07

  • 我也遇到同样的情形,也是在 MacBook

  • 把代码里加上了 Thread.sleep() 就可以模拟出来效果了。所以,我怀疑是CPU处理太快了,还没来得及让步就已经执行完了。

public void demo01(int num){
    synchronized (this){
        for(int i=0; i<10; i++){
            System.out.printf("demo01 - %d - %d\n", num, i);
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public static void main(String[] args) {
    SynchronizedDemo demo01 = new SynchronizedDemo();
    SynchronizedDemo demo02 = new SynchronizedDemo();

    ExecutorService exec = Executors.newCachedThreadPool();
    exec.submit(() -> {
        demo01.demo01(111);
    });
    exec.submit(() -> {
        demo02.demo01(222);
    });
    exec.shutdown();
}
  • 另外只能在 main 中测试, 不能放到 JUnit 中测试,下面的代码不会得到预期的结果。

@Test
public void test01(){
    SynchronizedDemo demo01 = new SynchronizedDemo();
    SynchronizedDemo demo02 = new SynchronizedDemo();

    ExecutorService exec = Executors.newCachedThreadPool();
    exec.submit(() -> {
        demo01.demo01(111);
    });
    exec.submit(() -> {
        demo02.demo01(222);
    });
    exec.shutdown();
}







0
0

Jimin

2018-07-22

你好,当前代码调用输出的结果有序是没什么问题的,这里本身只有两个线程,每个线程都会打印0~9,因为这里方法上有synchronized修饰,同一时间只会有一个线程去执行,因此总体上顺序是可以保证的。

另外,这里的日志和代码不是完全对应的,代码里调用的是test2方法,实际的日志显示的是调用的test1方法。不过,倒是没什么影响

0
2
Jimin
回复
南国漂泊
我的意思是他的结果不代表是错的啊,分析代码,他运行得到的结果是其中一种情况啊。
2018-08-07
共2条回复

星星993

提问者

2018-07-18

//img.mukewang.com/szimg/5b4f452b00010f5117641394.jpg程序都是一样的

0
3
南国漂泊
回复
Jimin
原来这里还隐藏了这么复杂的知识点啊。我晕,之前一直不知道,老师提到,我才去看了源码,确实是 synchronized(this){...} , out本身是 private static final 修饰的,应该是在static native registerNatives()中初始化的。并发不容易啊,简单的sout都不能随便使用啦…… 感谢老师提供额外的知识点,谢谢!
2018-08-07
共3条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程