synchronized方法与synchronized块

Ank*_*kur 4 java concurrency

如果我有以下代码

class SomeClass {    
...
public synchronized methodA() {
....
}

public synchronized methodB(){
....
}
}
Run Code Online (Sandbox Code Playgroud)

这将在'this'对象上同步.
但是,如果我的主要目标是确保多个线程不同时使用methodA(或methodB),但是它们可以同时使用methodA和methodB,
那么这种设计是否有限制?因为这里thread1锁定对象(与对象关联的监视对象)以运行methodA但同时thread2也在等待对象锁,即使methodA和methodB可以并发运行.
这种理解是否正确?

如果是,这是我们在私有虚拟对象上使用synchronized块的情况,以便methodA和methodB可以与不同的线程并行运行,但不能与不同线程的methodA(或methodB)并行运行.
谢谢.

Sea*_*oyd 9

你自己回答了这个问题:每种方法使用一个锁定对象,你就安全了.

private final Object lockA = new Object();
private final Object lockB = new Object();
public void methodA() {
    synchronized(lockA){
        ....
    }
}
public void methodB() {
    synchronized(lockB){
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)

对于更高级的锁定机制(例如ReentrantLock),请阅读Brian Goetz等人的Java Concurrency in Practice.您还应该阅读Josh Bloch撰写的Effective Java,它还包含一些有关使用的内容synchronized.