我们有一项任务要完成,dummyMethod
.
private synchronized void dummyMethod(){
Log.d("debug", "do nothing in dummyMethod()")
}
我们将该任务运行了几次.
private synchronized void fooMethod() throws InterruptedException{
for (int i = 0; i < 10; i++){
dummyMethod();
}
Thread.sleep(10000)
Log.d("debug", "fooMethod() finished")
}
在上述代码同步的情况下,立即执行dummyMethod()
10次.
然而,在下面的代码中,dummyMethod()
只被立即调用一次,并且只有在fooMethod()
完成之后,它才被完成并执行9次.
private synchronized void fooMethod() throws InterruptedException{
new Thread(()->{
for (int i = 0; i < 10; i++){
dummyMethod();
}
}).start();
Thread.sleep(10000)
Log.d("debug", "fooMethod() finished")
}
在本例中,logcat显示:
Long monitor contention with owner main (18077) at void ...fooMethod()(MainActivity.java:1106) waiters=0 in void ...MainActivity.dummyMethod() for 10.001s
我认为在后一种情况下,它不会被新的线程阻塞.有谁能解释一下这件事吗?一个同步的方法如何在一个新线程中多次异步运行另一个同步的方法?