什么是单例模式
- 单例模式(Singleton),简单来说,就是被单例的对象只能有一个实例存在。
- 单例模式的实现方式
一个类能返回对象的一个引用(同一个)和一个获得该唯一实例的方法(静态方法)通过单例模式,我们可以保证系统中只有一个实例,从而达到节约或者控制系统资源的目的 - 举个例子
1.在现实生活中跟你结婚的女人肯定只有一个,不然你就等着死翘翘了,重婚罪可不小--! - 实现单例的几种模式
- 饿汉模式
public class MyWife
{
// singleton
public MyWife() {}
private static final MyWife myWife = new MyWife();
public static MyWife getWife()
{
return myWife;
}
}
- 饿汉就是不管有没有调用过获得实例的方法,每次都会新建一个实例。
- 懒汉模式
public class MyWife
{
private static MyWife myWife;
public MyWife (){};
private static MyWife getWife()
{
if (myWife== null)
{
myWife= new MyWife ();
}
return myWife;
}
}
- 懒汉模式 缺点,如果是多个线程调用就会创建多个单例
- 懒汉模式线程安全,简单点的直接加同步关键字synchronized
public class MyWife
{
private static MyWife myWife;
public MyWife (){};
private static synchronized MyWife getWife()
{
if (wife == null)
{
myWife= new MyWife ();
}
return myWife;
}
}
- 双重检验锁
public class MyWife
{
private volatile static MyWife myWife;
private MyWife(){ }
public static MyWife getWife()
{
if (myWife == null)
{
synchronized(MyWife.class)
{
if (myWife == null)
{
myWife = new MyWife();
}
}
}
return myWife;
}
}
- 对于双重检验锁并不是太推荐使用,因为volatile 关键字作用是防止编译器自行优化代码 但是volatile 关键字在某些老版本的 JDK 中无法正常工作
5 静态内部类的单例模式
public class MyWife
{
private static class WifeHodler
{
private static final MyWife myWife = new MyWife();
}
public static MyWife getMyWife()
{
return WifeHodler.myWife;
}
}
- 这种方式是推荐使用的,首先 WifeHolder 类是私有的,除了 getMyWife() 之外没有其它方式可以访问实例对象,而且只有在调用 getWife() 时才会去真正创建实例对象
- 枚举的单例模式
public enum MyWife
{
INSTANCE;
// 自定义任意的方法
public void whateverMethod()
{
}
}
-
这种方式使用较好,但是逼格比较高 , 有兴趣可以试试