单例模式Singleton实现(C++&Java)
2014-09-22 10:56
369 查看
实现Singleton模式,分别用C++和Java实现。
首先C++:
class Singleton
{
private:
Singleton() {}
static Singleton* instance;
public:
static Singleton* getInstance()
{
if(instance == NULL)
{
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = NULL;
考虑到线程安全和异常安全,进行下面的扩展:
Class Lock
{
private:
CCriticalSection m_cs;
public:
Lock(CCriticalSection cs) : m_cs(cs)
{
m_cs.Lock();
}
~Lock()
{
m_cs.Unlock();
}
};
Class Singleton
{
private:
static Singleton* instance;
Singleton()
{
}
static CCriticalSection cs;
public:
static Singleton* getInstance()
{
if(instance == NULL)
{
Lock(cs);
if(instance == NULL)
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = NULL;
JAVA实现:
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if(instance == null) //1
instance = new Singleton(); //2
return instance;
}
}
不足:线程不安全,比如:
当线程1执行完1的时候,被挂起
线程2继续执行1,执行完1也被挂起
线程1恢复执行,创建出一个对象
线程2恢复执行,也创建出一个对象
所以会创建出两个实例。
改进:
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static synchronized Singleton getInstance() { //该函数被上锁,同一时刻只能被一个线程访问
if(instance == null) instance = new Singleton();
return instance;
}
}
不足:虽然是线程安全的,但是效率低下,一个时候只能被一个线程访问,不支持并发访问。
改进:
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if(instance == null) {
synchronized(Singleton.class) {
if(instance == null)
instance = new Singleton();
}
}
return instance;
}
}
线程安全,而且效率较高,支持多线程并发访问。
首先C++:
class Singleton
{
private:
Singleton() {}
static Singleton* instance;
public:
static Singleton* getInstance()
{
if(instance == NULL)
{
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = NULL;
考虑到线程安全和异常安全,进行下面的扩展:
Class Lock
{
private:
CCriticalSection m_cs;
public:
Lock(CCriticalSection cs) : m_cs(cs)
{
m_cs.Lock();
}
~Lock()
{
m_cs.Unlock();
}
};
Class Singleton
{
private:
static Singleton* instance;
Singleton()
{
}
static CCriticalSection cs;
public:
static Singleton* getInstance()
{
if(instance == NULL)
{
Lock(cs);
if(instance == NULL)
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = NULL;
JAVA实现:
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if(instance == null) //1
instance = new Singleton(); //2
return instance;
}
}
不足:线程不安全,比如:
当线程1执行完1的时候,被挂起
线程2继续执行1,执行完1也被挂起
线程1恢复执行,创建出一个对象
线程2恢复执行,也创建出一个对象
所以会创建出两个实例。
改进:
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static synchronized Singleton getInstance() { //该函数被上锁,同一时刻只能被一个线程访问
if(instance == null) instance = new Singleton();
return instance;
}
}
不足:虽然是线程安全的,但是效率低下,一个时候只能被一个线程访问,不支持并发访问。
改进:
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if(instance == null) {
synchronized(Singleton.class) {
if(instance == null)
instance = new Singleton();
}
}
return instance;
}
}
线程安全,而且效率较高,支持多线程并发访问。
相关文章推荐
- 【数据结构&&算法系列】KMP算法介绍及实现(c++ && java)
- 【数据结构&&等差数列】KMP简介和算法的实现(c++ && java)
- 算法思路重新实现-堆排序 中的 C++ & Java
- 【转载】【数据结构&&算法系列】KMP算法介绍及实现(c++ && java)
- 【数据结构&&等差数列】KMP简介和算法的实现(c++ && java)
- c++中实现类似java printStackTrac…
- C++&java实现的一颗纯MCTS
- java调用C++实现口令屏蔽
- 在JAVA中实现C++代码的复用
- 多继承实现COM类中的"菱形问题" C++也有一样的菱形问题
- Ajax - JavaScript之实现私有属性、像C++和Java一样支持基于类的继承方法之例子
- IP层的封装(Java的InetAddress类的C++实现)
- 用C实现C++的多态---剖析GTK的"对象" (一)
- USB口异常与C++&Java
- c++ --> java
- 各种排序算法C#实现&比较论文(可以供java程序员参考)
- 用C实现C++的多态---剖析GTK的"对象" (三)
- Delphi中实现C++/Java类似静态变量的功能
- 用C实现C++的多态---剖析GTK的"对象" (二)
- I/O流的设计(Java的InputStream/OuputStream和Reader/Writer的C++实现)