单例模式:确保一个类只有一个实例,并提供一个全局访问点
有一些对象有时候只需要一个,比方说:线程池(threadpool)、缓存(cache)、对话框、处理偏好设置和注册表(registry)的对象、日志对象、充当打印机、显卡等设备的驱动程序的对象。
处理多线程的三种单例方法:
1.同步(synchronized)方法
这个方法性能大大降低
2.使用急切创建实例
这个方法只是稍微陌生了
3.双重检查加锁
这个方法还得确定使用的是Java5以上的版本。
4.包含单个元素的枚举类型:
无偿提供序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。
单元素的枚举类型已经成为实现Singleton的最佳方法。
问:如果有多个加载器呢。
每个类加载器都定义了一个命名空间,如果有两个以上的类加载器,不同的类加载器可能会加载同一个类。
如果你的程序有多个类加载器又同时使用了单件模式,请小心。有一个解决办法:自行制定类加载器,并指定同一个类加载器。
问:可以继承单件类嘛?
因为构造器是私有的,不能被继承,final也一样。
====================================================================
懒汉式 与 饿汉式的区别就是:创建对象的时间不同
懒汉式
public class Singleton{
private Singleton(){}
private static Singleton singleton = null;
public static synchronized Singleton getInstance(){
if(singleton == null) {
singleton = new Singleton ();
}
return singleton ;
}
}
public class Singleton{
public Singleton(){}
private static Singleton singleton = new Singleton();
public static Singleton getInstance(){
return singleton;
}
}