从同步方法调用的非同步方法是否允许线程阻塞?
public synchronized void foo(){
someStuff();
someMoreStuff();
bar();
}
public void bar(){
//... does some things
}
如果一个线程正在执行foo(),那么确保在线程休眠之前调用bar()?
TIA
答案 0 :(得分:3)
线程总是可以被抢占(在Java中没有办法阻止它),但在foo
返回之前,没有其他线程能够获取同一对象的锁。
请注意,“丢失CPU”的线程并不是“阻塞”通常所指的线程 - 通常,如果需要等待其他事情发生,则认为呼叫会被阻止。例如:
这些非常与耗尽时间片不同。
答案 1 :(得分:1)
您是否在询问是否有办法确保Java VM不占用CPU并让另一个线程执行?您可以将线程优先级设置为高,但这仍然无法提供保证。
但是,如果没有CPU,其他任何线程都无法调用您的“foo”方法。同样,同步“bar”会阻止它被调用,直到你对“foo”的调用完成(因为你拥有整个“foo”方法的锁定)。
答案 2 :(得分:1)
问题似乎是,如果其他线程可以自由地调用bar(),而一个线程在执行foo()期间持有对象的锁定。具体来说,如果两个或多个线程可以同时运行bar()。
答案是任何线程都可以随时运行bar(),所以是的,在任何一个时间点都可以有多个线程运行bar()。