一个单例模式的简单例子
2009-03-29 14:56
447 查看
ex1:
public class Singleton
{
private static final Singleton singleton = null;
private Singleton()
{
}
public static Singleton getInstance()
{
if (singleton== null)
{
singleton= new Singleton();
}
return singleton;
}
}
这个不多说了,肯定是错误的,如果多个线程访问的时候都死==null,那么接下来就是产生多个实例。不算单例模式。
ex2:
public class Singleton
{
private static final Singleton singleton = null;
private Singleton()
{
}
public static Singleton getInstance()
{
if (singleton== null)
{
synchronized (Singleton.class) {
singleton= new Singleton();
}
}
return singleton;
}
}
这个虽然加了同步锁,但是如果多个线程同步访问==null,那么还是会产生多个实例,只是产生实例的时候同步而已。
ex3:
public class Singleton
{
private static final Singleton singleton = null;
private Singleton()
{
}
public static Singleton getInstance()
{
synchronized (Singleton.class)
{
if (singleton== null)
{
singleton= new Singleton();
}
}
return singleton;
}
}
这个就可以了,但是这个地方对于每个访问的这个方法都是同步,而最需要的同步只是在new的地方,所以这样做虽然保证了单例,但是效率有点低哦。
ex4:
public class Singleton
{
private static final Singleton singleton = null;
private Singleton()
{
}
public static Singleton getInstance()
{
if (singleton== null)
{
synchronized (Singleton.class)
{
if (singleton== null)
{
singleton= new Singleton();
}
}
}
return singleton;
}
}
这个不错,保证了单例。这个叫做double-check 双重检查。
还有一个比较简单的写法。
ex5:
public class Singleton
{
private static final Singleton singleton = new Singleton();
private Singleton()
{
}
public static Singleton getInstance()
{
return singleton;
}
}
这样也可以,具体2种差别就不多说了。下面这个看起来要简单好多的哈
public class Singleton
{
private static final Singleton singleton = null;
private Singleton()
{
}
public static Singleton getInstance()
{
if (singleton== null)
{
singleton= new Singleton();
}
return singleton;
}
}
这个不多说了,肯定是错误的,如果多个线程访问的时候都死==null,那么接下来就是产生多个实例。不算单例模式。
ex2:
public class Singleton
{
private static final Singleton singleton = null;
private Singleton()
{
}
public static Singleton getInstance()
{
if (singleton== null)
{
synchronized (Singleton.class) {
singleton= new Singleton();
}
}
return singleton;
}
}
这个虽然加了同步锁,但是如果多个线程同步访问==null,那么还是会产生多个实例,只是产生实例的时候同步而已。
ex3:
public class Singleton
{
private static final Singleton singleton = null;
private Singleton()
{
}
public static Singleton getInstance()
{
synchronized (Singleton.class)
{
if (singleton== null)
{
singleton= new Singleton();
}
}
return singleton;
}
}
这个就可以了,但是这个地方对于每个访问的这个方法都是同步,而最需要的同步只是在new的地方,所以这样做虽然保证了单例,但是效率有点低哦。
ex4:
public class Singleton
{
private static final Singleton singleton = null;
private Singleton()
{
}
public static Singleton getInstance()
{
if (singleton== null)
{
synchronized (Singleton.class)
{
if (singleton== null)
{
singleton= new Singleton();
}
}
}
return singleton;
}
}
这个不错,保证了单例。这个叫做double-check 双重检查。
还有一个比较简单的写法。
ex5:
public class Singleton
{
private static final Singleton singleton = new Singleton();
private Singleton()
{
}
public static Singleton getInstance()
{
return singleton;
}
}
这样也可以,具体2种差别就不多说了。下面这个看起来要简单好多的哈
相关文章推荐
- C# 一个简单的 工厂模式 例子
- 使用模式的一个简单例子——画图程序
- 用装饰模式优化代码的一个简单例子
- 用装饰模式优化代码的一个简单例子
- C#面向对象的一个简单例子,继承、接口、重写都用上了,还用到了工厂模式
- 用装饰模式优化代码的一个简单例子
- 一个简单的观察者模式例子
- 一个简单例子的设计模式分析
- Observer模式 的一个简单的例子
- 用装饰模式优化代码的一个简单例子
- [原创]一个简单例子解释 Java 工厂模式
- 一个单例模式的简单例子
- 一个例子讲解adapter设计模式(非常简单)
- 关于一个简单的策略设计模式的例子
- 一个单例模式的简单例子
- 一个简单工厂模式的小例子
- 一个简单的TCP通信的例子
- 测试驱动开发随笔------一个最简单的例子
- 一个简单的socket客户端和服务端的例子
- 以一个最简单的例子把OO的JavaScript说明白