这个地方为什么我执行的结果一直是有序的呢?
来源:3-3 线程安全性-原子性-synchronized

星星993
2018-07-18
写回答
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(); }
00 -
Jimin
2018-07-22
你好,当前代码调用输出的结果有序是没什么问题的,这里本身只有两个线程,每个线程都会打印0~9,因为这里方法上有synchronized修饰,同一时间只会有一个线程去执行,因此总体上顺序是可以保证的。
另外,这里的日志和代码不是完全对应的,代码里调用的是test2方法,实际的日志显示的是调用的test1方法。不过,倒是没什么影响
022018-08-07 -
星星993
提问者
2018-07-18
程序都是一样的
032018-08-07
相似问题