同步vs ReentrantLock:它们实际上在哪些方面有所不同?

时间:2019-06-18 19:15:42

标签: java synchronization locking singleton reentrantlock

我正在尝试一些示例来创建完美(或接近完美的单例类)

我为此准备了一些代码(到目前为止,序列化问题尚未考虑在图片中)

public class SingletonDoubleCheck {

String message ;

private static Object lock=new Object();
private static SingletonDoubleCheck INSTANCE ;


private SingletonDoubleCheck() {
    synchronized(lock) {
        System.out.println("syncronized constructor...");
        if(INSTANCE!=null) {
            throw new UnsupportedOperationException("can not instansiate Singleton class more than once");
        }
    }
    message = "Default Message";
}


public static SingletonDoubleCheck getInstance() {
    System.out.println("getting instance...");
    if(INSTANCE==null) {
        System.out.println("syncronizing to get Instance...");
        synchronized (lock){
            System.out.println("syncronized get Instance...");
            if(INSTANCE==null)
                INSTANCE=new SingletonDoubleCheck();
        }
    }
    return INSTANCE;
}



public String getMessage() {
    return message;
}
public void setMessage(String message) {
    this.message = message;
}

}

运行此代码,我可以看到Synchronized块重新进入执行。因此,我有点困惑,在这种情况下应该真正使用可重入锁,以及如何决定在何处使用可重入锁以及在何处使用同步,因为它们都允许在同一线程中运行时对同一对象进行可重入锁。 >

0 个答案:

没有答案