讨论/《深入浅出设计模式》 - 单例模式 Singleton/
《深入浅出设计模式》 - 单例模式 Singleton
共 6 个回复

《实战Java高并发程序设计》的作者建议不要用双重检测法 即这里的懒汉式
因为这样写低版本的JVM甚至无法保证线程安全
书上给出的是方法级别加锁

public class Singleton {
    private static Singleton instance = null;
    private Singleton() {
    }
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
3

枚举方式呢?

2

c++实现:
静态变量实现线程安全饿汉式:

class Singleton{
private:
    Singleton(){}
    Singleton(const Singleton& temp){}
    Singleton& operator=(const Singleton& temp){}
public:
    static Singleton& getInstence(){ 
        static Singleton instence;
        return instence;
    }
};

加锁实现线程安全饿汉式:

class Singleton{
private:
    static pthread_mutex_t mutex;
    static Singleton * instence;
    Singleton(){
        pthread_mutex_init(&mutex, NULL); 
    }
    Singleton(const Singleton& tmp){}
    Singleton& operator=(const Singleton& tmp){}
public:
    static Singleton* getInstence(){
        if(instence == NULL) {
            pthread_mutex_lock(&mutex);
            if(instence == NULL){            
                instence = new Singleton();            
            }
            pthread_mutex_unlock(&mutex);
        }
        return instence;
    }
};
Singleton* Singleton::instence = NULL;
pthread_mutex_t Singleton::mutex;

这个问题很有意思,我去查了些资料。这里的synchronized修饰的是静态方法所以等价于synchronized(this.class)。静态方法是每个实例只有一份的,字节码中这个方法会加上一个标记,JVM层面确保了只有一个线程能够访问synchronized修饰的静态方法。

这种效果我猜想会不会和只有一层if判断的那种实现效果是一样的,您给出的这种是调用方法对实例上锁,本文给出的方式是进入方法对整个类上锁。

枚举属于饿汉式加载