单例模式的介绍
单例模式是java里面设计模式之一,是一个比较简单的设计模式,并且是一个用的比较多的设计模式。单例模式属于创建型模式。单例模式顾名思义就是只有一个实例,并且她自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,不需要实例化该类的对象。其核心就是:构造方法私有化。
单例模式的几种写法
1、懒汉式(线程不安全)
最基础的实现方式 不支持多线程 线程不安全
public class Singleton{
//创建对象
private static Singleton instance;
//构造函数私有化 这样类就不会被实例化了
private Singleton(){}
//判断是否存在 根据判断的结果来决定是否获取对象
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton;
}
return instance;
}
}
2、懒汉式(线程安全)
public class Singleton{
//创建对象
private static Singleton instance;
//构造函数私有化 这样类就不会被实例化了
private Singleton(){}
//判断是否存在 根据判断的结果来决定是否获取对象
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton;
}
return instance;
}
}
3、饿汉式(线程安全)
饿汉式,从名字上也很好理解,就是“比较勤”,实例在初始化的时候就已经建好了,不管你有没有用到,都先建好了再说。好处是没有线程安全的问题,坏处是浪费内存空间。
public class Singleton{
//创建对象
private static Singleton instance = new instance();
//构造函数私有化 这样类就不会被实例化了
private Singleton(){}
//直接返回对象
public static synchronized Singleton getInstance(){
return instance;
}
}
4、懒汉式(双捡锁)
双检锁,又叫双重校验锁,综合了懒汉式和饿汉式两者的优缺点整合而成。看上面代码实现中,特点是在synchronized关键字内外都加了一层 if 条件判断,这样既保证了线程安全,又比直接上锁提高了执行效率,还节省了内存空间。
public class Singleton{
//创建对象
private static Singleton instance;
//构造函数私有化 这样类就不会被实例化了
private Singleton(){}
//
public static synchronized Singleton getInstance(){
if(instance == null){
synchronized(Singliton.class){
if(instance == null ){
instance = new Singleton;
}
}
}
return instance;
}
}
5、静态内部类
静态内部类的方式效果类似双检锁,但实现更简单。但这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用
public class Singleton{
private static class SingletonHolder{
private static final Singleton INSTANCE = new Singleton();
}
private Singleton(){}
public static final Singleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
6、枚举
枚举的方式是比较少见的一种实现方式,但是看上面的代码实现,却更简洁清晰。并且她还自动支持序列化机制,绝对防止多次实例化。
public enum Singleton{
INSTANCE;
public void anyMrthod(){
}
}