单例模式——Singleton

public class Singleton {
    private static Singleton instance;

    private Singleton(){}

    public static Singleton getInstance(){
        if(instance==null){
            instance=new Singleton();
        }else{
        }
        return instance;
    }

    public void fun(){
        System.out.println("in fun()");
    }
}

调用:

public static void main(String[] args) {
		Singleton sgt1=Singleton.getInstance();
		sgt1.fun();
		
		Singleton sgt2=Singleton.getInstance();
		sgt2.fun();
		
		Singleton sgt3=Singleton.getInstance();
		sgt3.fun();
}

上面的写法太天真,不能保证多线程安全性,如果要保证多线程安全,要这样写:C++代码:

#include <stdio.h>
#include <pthread.h>

//c语言中没有类到概念,最抽象到数据概念就是结构体;c++中才有class关键字。因此文件后缀是.cpp,而非.c
class Singleton{
private:
	Singleton(){}

	static Singleton* instance;
	static pthread_mutex_t lock;
	
public:
	//~Singleton(){}

	static void mutex_init(){
		pthread_mutex_init(&lock, NULL);
	}

	static Singleton* getInstance(){
		if(instance==NULL){
			pthread_mutex_lock(&lock);
			if(instance==NULL){
				instance=new Singleton;
				printf("obj created.\n");
			}
			pthread_mutex_unlock(&lock);
		}
		return instance;
	}

	static void mutex_destroy(){
		pthread_mutex_destroy(&lock);
	}

};

Singleton* Singleton::instance = 0; //类中声明的静态数据,需要再类外面再定义一次
pthread_mutex_t Singleton::lock;

void* fun1(void*){
	printf("%d\n", Singleton::getInstance());
}

void* fun2(void*){
	printf("%d\n", Singleton::getInstance());
}


int main(void){
	//两个线程使用singleton模式
	Singleton::mutex_init();

	pthread_t pid1, pid2;
	pthread_create(&pid1, NULL, fun1, NULL);
	pthread_create(&pid2, NULL, fun2, NULL);

	pthread_join(pid1, NULL);
	pthread_join(pid2, NULL);

	Singleton::mutex_destroy();

	return 0;
}

java代码(片段):

public static Singleton getInstance(){
    if(instance==NULL){
        synchronized(Singleton.class){
            if(instance==NULL){
	        instance=new Singleton;
	        printf("obj created.\n");
	    }
	}
    }
    return instance;
}

猜你喜欢

转载自chuanwang66.iteye.com/blog/1335225