单例模式是设计模式中最简单的一种模式,特点是类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点。
单例模式有很多变型,下面介绍不同的几个单例模式。
饿汉式
优点:简单,线程安全,无同步开销
缺点:浪费内存,类加载的时候就会分配内存
package SingleTon;
/**
* 饿汉式单例
*/
public class HungrySingleTon {
// 私有的构造方法
private HungrySingleTon() {
}
// 加载类时就初始化变量
private static final HungrySingleTon instance = new HungrySingleTon();
// 静态方法返回该类的实例
public static HungrySingleTon getInstancei() {
return instance;
}
}
懒汉式
优点:节约内存,只在使用时分配
缺点:需同步开销来避免多线程问题。
package SingleTon;
/**
* 懒汉式单例
*/
public class LazySingleTon {
// 私有构造函数
private LazySingleTon() {
}
// 不初始化实例,不能用final
private static LazySingleTon instance;
// 使用时才初始化, 如果不加锁,则线程不安全
public static synchronized LazySingleTon getInstance() {
if (instance == null) {
instance = new LazySingleTon();
}
return instance;
}
}
枚举单例
优点:安全,简单,且不能被反射
缺点:
package SingleTon;
/**
* 枚巨单例
*/
public class EnumSingleTon {
private EnumSingleTon(){}
public static EnumSingleTon getInstance(){
return SingleTon.INSTANCE.getInstance();
}
private static enum SingleTon{
INSTANCE;
private EnumSingleTon singleTon;
//此方法只会调用一次
private SingleTon(){
singleTon = new EnumSingleTon();
}
public EnumSingleTon getInstance(){
return singleTon;
}
}
}
单例应用场景
- windows回收站
- windows任务管理器
- 日志应用
- 数据库线程池
单例应用特点
- 资源共享,避免资源操作的性能或损耗
- 资源控制,方便线程间的使用