[英]synchronized method vs synchronized block
如果我有以下代码
class SomeClass {
...
public synchronized methodA() {
....
}
public synchronized methodB(){
....
}
}
这将在“this”object 上同步。
但是,如果我在这里的主要目标是确保多个线程不会同时使用方法A(或方法B),但它们可以同时使用方法A 和方法B,
那么这种设计有限制吗? 因为这里thread1锁定了object(监视与对象关联的object)以运行methodA,但同时thread2也在等待object锁定,即使methodA和methodB可以同时运行。
这种理解正确吗?
如果是,这是我们在私有虚拟 object 上使用同步块的情况,以便方法 A 和方法 B 可以使用不同的线程并行运行,但不能使用不同的线程并行运行方法 A(或方法 B)。
谢谢。
您自己已经回答了这个问题:每种方法使用一个锁 object 并且您是安全的。
private final Object lockA = new Object();
private final Object lockB = new Object();
public void methodA() {
synchronized(lockA){
....
}
}
public void methodB() {
synchronized(lockB){
....
}
}
有关更高级的锁定机制(例如ReentrantLock
),请阅读 Brian Goetz 等人的Java Concurrency in Practice 。 您还应该阅读Josh Bloch 的 Effective Java ,它还包含一些关于使用synchronized
的项目。
如果您想允许同时运行 methodA( methodA()
和methodB()
但将每个方法限制为一个线程,那么您需要两个单独的对象来同步。 例如:
class SomeClass {
private final Object lockA = new Object();
private final Object lockB = new Object();
public void methodA() {
synchronized (lockA) {
//
}
}
public void methodB() {
synchronized (lockB) {
//
}
}
}
如果我的理解是正确的,您希望允许线程 T1 在线程 T2 运行 methodB() 的同时运行 methodA() - 但您不希望线程 T1 在线程 T2 运行 methodA() 的同时运行 methodA() )(对于方法B也是如此)对吗? 对于这种情况,您不能只使用一个简单的同步方法——相反,正如您所说,您将需要 2 个虚拟对象(一个用于方法 A,一个用于方法 B)进行同步。 或者您可以使用新的 Lock class -- 每个方法一个 Lock 实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.