【发布时间】:2011-09-21 00:34:53
【问题描述】:
我有两个同步方法的课程:
class Service {
public synchronized void calc1();
public synchronized void calc2();
}
两者都需要相当长的时间来执行。问题是这些方法的执行会相互阻塞。 IE。两种方法可以在不同线程中并行执行吗?
【问题讨论】:
标签: java synchronization synchronized
我有两个同步方法的课程:
class Service {
public synchronized void calc1();
public synchronized void calc2();
}
两者都需要相当长的时间来执行。问题是这些方法的执行会相互阻塞。 IE。两种方法可以在不同线程中并行执行吗?
【问题讨论】:
标签: java synchronization synchronized
不它们不能在同一个服务上并行执行 - 两种方法共享同一个监视器(即this),因此如果线程 A 正在执行 calc1,则线程 B将无法获得监视器,因此将无法运行calc2。 (请注意,线程 B 可以在 Service 的不同 instance 上调用任一方法,因为它将尝试获取不同的未持有的监视器,因为所讨论的 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
}
}
}
所讨论的“锁”不需要具有任何特殊能力,而不是作为对象,因此具有特定的监视器。如果您有更复杂的要求,可能涉及尝试立即锁定和回退,或查询谁持有锁定,您可以使用实际的 Lock 对象,但对于基本情况,这些简单的 @987654328 @锁很好。
【讨论】:
Service 对象,问题没有对此作出声明。
是的,您可以在两个不同的线程中执行它们而不会弄乱您的类内部,但不它们不会并行运行 - 只会执行其中一个每次。
【讨论】:
不,他们不可能。在这种情况下,您可能会使用 synchronized 块而不是同步整个方法。不要忘记在不同的对象上进行同步。
【讨论】: