您的位置:首页 > 其它

单例模式

2016-02-21 22:26 363 查看
本文转自:http://blog.csdn.net/silence1214/article/details/4033800

单例模式就是为了保证一个类只有一个实例,具体实现如下:

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种差别就不多说了。下面这个看起来要简单好多的哈
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: