既解决了”懒汉式“的多线程问题,又解决了资源浪费的现象,看上去是一种不错的选择,如下:
public class Foo {
private static Foo foo;
// 构造函数私有化
private Foo() {
}
// 提供一个全局的静态方法
public static Foo getFoo() {
if (foo == null) {
synchronized (Foo.class) {
if (foo == null) {
foo = new Foo();
}
}
}
return foo;
}
}
单例模式的优缺点分析:
优点:客户端使用单例模式的实例的时候,只需要调用一个单一的方法即可生成一个唯一的实例,有利于节约资源。
缺点:首先单例模式很难实现序列化,这就导致采用单例模式的类很难被持久化,当然也很难通过网络传输;其次由于单例采用静态方法,无法在继承结构中使用。
--------------------------------------------------------------------------------------------------------------------------------------
《effective java》里面已经承认单元素枚举类是实现单例模式最好的方法(从java1.5版本开始)
单元素枚举类型更加简洁、无偿的提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击时;它已经成为实现Singleton的最佳方法。
/**
* 枚举类型的单例模式(不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象)
* 编写一个包含单个元素的枚举类型[极推荐]
* @author Administrator
*
*/
public enum MaYun {
himself; //定义一个枚举的元素,就代表MaYun的一个实例
// private String name;
MaYun() {
//MaYun诞生要做的事情
//可以去掉
System.out.println("MaYun出生了!");
}
public void callAll() {
System.out.println("大家都来看呀!!!");
}
}
call: MaYun.himself.callAll();