`

单例模式——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;
}

 

 

 

 

 

分享到:
评论

相关推荐

    c#单例模式(Singleton)的6种实现

    如:IO处理,数据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创建或始终使用一个公用的实例,这就是我们今天要介绍的——单例模式(Singleton)。  使用频率高 单件模式(Singleton...

    android开发设计模式之——单例模式详解

     单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点 二、适用场景 1. 应用中某个实例对象需要频繁的被访问。 2. 应用中每次启动只会存在一个实例。如账号系统,数据库系统。 三、常用...

    管理系统javasal源码-Design-Patterns-Demo:超全的设计模式——理论+实现demo

    Pattern)单例模式(Singleton Pattern)建造者模式(Builder Pattern)原型模式(Prototype Pattern) 2 结构型模式:这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 ...

    design-pattern-java.pdf

    工厂三兄弟之抽象工厂模式(二) 工厂三兄弟之抽象工厂模式(三) 工厂三兄弟之抽象工厂模式(四) 工厂三兄弟之抽象工厂模式(五) 单例模式-Singleton Pattern 确保对象的唯一性——单例模式 (一) 确保对象的...

    Think in ActionScript 3.0Ⅰ Ⅱ Ⅲ汇总

    4.7.4 单例模式(Singleton Pattern) 5. 多态(Polymorphism) 5.1 多态的概念 5.2 多态存在的三个必要条件 5.3 TestPolymoph.as —— 多态的应用,体会多态带来的好处 5.4 TestPolymoph 内存分析 5.5 多态的好处 ...

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码

    C中实现单例模式7.4 子类化Singleton7.5 线程安全7.6 在Cocoa Touch框架中使用单例模式7.6.1 使用UIApplication类7.6.2 使用UIAccelerometer类7.6.3 使用NSFileManager类7.7 总结第三部分 接口适配第8章 适配器8.1 ...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷6

    pattern/src/creation/singleton //11.3单例模式 pattern/src/creation/builder //11.4建造者模式 pattern/src/creation/prototype //11.5原型模式 pattern/src/structure/adapter //12.1适配器模式 pattern/src/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷8

    pattern/src/creation/singleton //11.3单例模式 pattern/src/creation/builder //11.4建造者模式 pattern/src/creation/prototype //11.5原型模式 pattern/src/structure/adapter //12.1适配器模式 pattern/src/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷10

    pattern/src/creation/singleton //11.3单例模式 pattern/src/creation/builder //11.4建造者模式 pattern/src/creation/prototype //11.5原型模式 pattern/src/structure/adapter //12.1适配器模式 pattern/src/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷5

    pattern/src/creation/singleton //11.3单例模式 pattern/src/creation/builder //11.4建造者模式 pattern/src/creation/prototype //11.5原型模式 pattern/src/structure/adapter //12.1适配器模式 pattern/src/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷3

    pattern/src/creation/singleton //11.3单例模式 pattern/src/creation/builder //11.4建造者模式 pattern/src/creation/prototype //11.5原型模式 pattern/src/structure/adapter //12.1适配器模式 pattern/src...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷1

    pattern/src/creation/singleton //11.3单例模式 pattern/src/creation/builder //11.4建造者模式 pattern/src/creation/prototype //11.5原型模式 pattern/src/structure/adapter //12.1适配器模式 pattern/src...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷2

    pattern/src/creation/singleton //11.3单例模式 pattern/src/creation/builder //11.4建造者模式 pattern/src/creation/prototype //11.5原型模式 pattern/src/structure/adapter //12.1适配器模式 pattern/src...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷7

    pattern/src/creation/singleton //11.3单例模式 pattern/src/creation/builder //11.4建造者模式 pattern/src/creation/prototype //11.5原型模式 pattern/src/structure/adapter //12.1适配器模式 pattern/src/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷9

    pattern/src/creation/singleton //11.3单例模式 pattern/src/creation/builder //11.4建造者模式 pattern/src/creation/prototype //11.5原型模式 pattern/src/structure/adapter //12.1适配器模式 pattern/src/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷4

    pattern/src/creation/singleton //11.3单例模式 pattern/src/creation/builder //11.4建造者模式 pattern/src/creation/prototype //11.5原型模式 pattern/src/structure/adapter //12.1适配器模式 pattern/src...

    C#23种设计模式_示例源代码及PDF

    单例模式: 而且自行实例化并向整个系统提供这个实 单例模式 单例模式确保某一个类只有一个实例, 例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。 结构型模式 6、ADAPTER —在朋友聚会上碰到...

    精通QTP——自动化测试技术领航

    5.1.2 单例设计模式(Singleton) 346 5.2 GUI层面向对象的扩展设计 351 5.2.1 层的概念 351 5.2.2 封装测试对象类 352 5.2.3 调用业务行为 355 5.2.4 对象识别结果分析 355 5.2.5 总结 356 6.1 框架设计理念 356 ...

    php网络开发完全手册

    5.7.2 单例模式(Singleton Pattern) 81 5.7.3 工厂模式(Factory Pattern) 83 5.8 接口与抽象类 86 5.8.1 接口的定义 86 5.8.2 单一接口的实现 87 5.8.3 多重接口的实现 87 5.8.4 抽象类 88 5.9 小结 90 第6章 ...

    Java JDK实例宝典

    8 Singleton单例模式 2. 9 Factory工厂模式 2. 10 Adapter适配器模式 第3章 数字 3. 1 数字与数字封装类 3. 2 格式化数字 3. 3 数字的舍入 3. 4 转换数字的进制 3. 5 生成随机数 ...

Global site tag (gtag.js) - Google Analytics