您的位置:首页 > 其它

单例模式

2016-03-06 19:46 323 查看
单例模式是一种很常用的模式,也是很多人都知道的一种模式,单例模式的定义是:保证一个类只有一个实例,并提供一个访问它的全局的访问点。这里的全局访问点就是我们所说的公开的静态获得实例的方法。

案例:我们创建两个类,一个类是Singleton,一个类是Consumer,并且都是单例,只允许创建一个实例。Singleton类使用单例模式中的饿汉式实现,Consumer类使用懒汉世来实现。

Singleton类如下:

public class Singleton {

private static Singleton instance = new Singleton();

private Singleton() {}

public static Singleton getInstance() {
return instance;
}
}
Consumer类如下:

public class Consumer {

private static Consumer instance;

private Consumer() {}

/**
* 注意多线程的情况
* synchronized同步,但是影响性能
*/
public static synchronized Consumer getInstance(){
if (instance == null) {
instance = new Consumer();
}
return instance;
}
}
接下来测试一下:

public class Test {

public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
if (s1 == s2) {
System.out.println(true);
}

Consumer c1 = Consumer.getInstance();
Consumer c2 = Consumer.getInstance();
if (c1 == c2) {
System.out.println(true);
}
}

}
总结:我们的测试结果是输出两个true,但是测试不算很严格,只是单纯的测试,没有使用多线程来测试。我们来分析一下两个不同的方式实现单例的优点和缺点。饿汉式是直接创建实例,缺点是在我们还没有使用该类之前就已经有实例了,并没有在我们需要的时候创建,优点是安全,无论是多线程还是单线程,都只会创建一个实例。懒汉式的话,优点是在需要使用的时候再创建,缺点是不安全,存在安全隐患。即使使用了同步机制synchronized,在类加载的时候加锁,但是如果是跨JVM的话,就有可能出现多实例的情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: