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; }