使用Synchronized (this) 对当前对象进行同步化,这很容易理解;
但对其他对象同步化,应该怎样理解?比如下面的代码,synchronized(syncObject) 语句,syncObject 就是一个普通对象Object,这样又有什么意义了?
import static net.mindview.util.Print.*;
class DualSynch {
private Object syncObject = new Object();
public synchronized void f() {
for(int i = 0; i < 5; i++) {
print("f()");
Thread.yield();
}
}
public void g() {
synchronized(syncObject) {
for(int i = 0; i < 5; i++) {
print("g()");
Thread.yield();
}
}
}
}
public class SyncObject {
public static void main(String[] args) {
final DualSynch ds = new DualSynch();
new Thread() {
public void run() {
ds.f();
}
}.start();
ds.g();
}
}
각 객체에는 객체 잠금이 있으며,
syncdhronized(syncObject)
는 syncObject의 객체 잠금을 사용하고,public synchronized void f()
는 ds의 객체 잠금을 사용합니다이 코드에서는 두 개의 잠금이 사용됩니다. 메소드 f가 실행되면 ds 객체의 잠금을 획득해야 하며, 메소드 g가 실행되면 syncObject의 객체 잠금을 획득해야 합니다. 이 두 자물쇠는 서로 아무 관련이 없습니다.
제가 이해한 바에 따르면 Java의 모든 객체에는
다음 코드의 두synchronized (this)
객체 자체를 잠그고synchronized (object)
잠금으로 사용되는 객체를 잠급니다.블록은 두 블록의 잠금이 서로 다른 개체에 추가되므로 동기화를 구성하지 않습니다.
synchronized
으아악잠금 개체로 별도의 개체를 사용하세요. 이 경우
ReentrantLock
을 사용한 다음lock()
를unlock()
및synchronized
으로 바꿀 수도 있습니다.public synchronized void f()
은 개체 자체인synchronized (this)
과 동일합니다.synchronized(syncObject)
는 다른 개체인 syncObject에 의해 잠겨 있습니다.결과는 다음과 같습니다. 새
DualSynch
객체를 생성하면f()
메서드와g()
메서드는 두 스레드에서 동시에 실행될 수 있지만 두 스레드에서는f()
및f()
을 동시에 실행할 수 없습니다. .g()
과g()
은 동시에 실행할 수 없습니다.public synchronized void f()
은synchronized(this)
에 비해synchronized(syncObject)
은Object syncObject
의 객체 잠금을 얻습니다.스레드가 개체의
f()
에 액세스하면 이 개체의 개체 잠금을 획득하고 개체의 모든 동기화 코드 부분에 대한 다른 스레드의 액세스가 일시적으로 차단됩니다. 그러나 다른 스레드는synchronized(this)
을 포함하여 개체의 동기화되지 않은 코드 블록에 계속 액세스할 수 있습니다. 마찬가지로 한 스레드가 개체의Object syncObject
에 액세스하면 개체g()
에 대한 다른 스레드의 액세스는 다음과 같습니다. 일시적으로 차단되었지만g()
에 해당하는synchronized(this)
에는 계속 액세스할 수 있습니다.f()