繁体   English   中英

同步方法与同步块

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM