Vla*_*mir 3 java synchronization synchronized
我有2个同步方法的类:
class Service {
public synchronized void calc1();
public synchronized void calc2();
}
Run Code Online (Sandbox Code Playgroud)
两者都需要相当长的时间来执行 问题是这些方法的执行会相互阻塞.即两种方法可以在不同的线程中并行执行吗?
And*_*yle 10
不,它们不能在同一服务上并行执行 - 两种方法共享同一个监视器(即this),因此如果线程A正在执行calc1,则线程B将无法获取监视器,因此将无法跑calc2.(请注意,线程B可以调用这两种方法在不同情况下的Service,虽然,因为它会试图获取不同的,unheld显示器,因为this问题会有所不同.)
最简单的解决方案(假设您希望它们独立运行)将使用显式监视器执行以下操作:
class Service {
private final Object calc1Lock = new Object();
private final Object calc2Lock = new Object();
public void calc1() {
synchronized(calc1Lock) {
// ... method body
}
}
public void calc2() {
synchronized(calc2Lock) {
// ... method body
}
}
}
Run Code Online (Sandbox Code Playgroud)
有问题的"锁"不需要具有除了对象之外的任何特殊能力,因此具有特定的监视器.如果您有更复杂的要求,可能涉及尝试立即锁定和回退,或者查询谁持有锁,您可以使用实际的Lock对象,但对于基本情况,这些简单的Object锁是可以的.