Java中synchronized修饰方法后仍出现异步输出的原因是什么
Java synchronized关键字未达到预期同步效果的原因
你代码中的synchronized关键字实际上已经生效,你观察到的输出交叉并不是方法异步执行的结果,而是锁粒度设置问题导致的正常现象,具体原因如下:
synchronized修饰非静态实例方法时,锁的是方法所属的对象实例,你的两个线程共用同一个Printer实例ob,所以确实同一时间只有一个线程能进入printHi方法执行,不存在两个线程同时输出的情况。- 你目前的锁粒度仅覆盖单次
printHi方法调用:方法执行完成(单条内容输出结束)后,锁就会立即释放,两个线程会重新竞争锁资源。锁竞争的结果由操作系统的线程调度策略决定,所以会出现两个线程交替输出、或是单个线程连续多次拿到锁输出多条内容的情况。
如果你想要实现「一个线程先输出完全部10条内容,另一个线程再开始输出」的效果,只需要把锁的粒度放大到覆盖整个循环即可,修改示例如下:
@Override public void run() { // 锁同一个Printer实例,覆盖整个循环逻辑 synchronized (objm) { for (int i = 0; i < 10; i++) { objm.printHi("MyThread" + i); } } }
YourThread的run方法做相同修改即可。
内容的提问来源于stack exchange,提问作者Hari Krishnan
相关产品推荐
相关产品推荐

