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