何为单例模式?
单例模式:当前进程中,单例模式创建的实例对象有且只有一个。
单例模式的特点
1、构造器私有的,外部无法通过构造方法创建该实例
2、通过get方法获取唯一的实例
3、在JVM中,该对象只有一个实例存在
单例模式的优点
1、避免类频繁创建增加系统开销
2、较少new创建对象,降低内存使用频率,较少GC
单例模式实现方式
/**
* 饿汉式 无法传参
* Created by lenovo on 2018/3/4.
*/
public class A {
private A() {
}
private static A a = new A();
public static A getA() {
return a;
}
}
饿汉式,简单粗暴,线程不安全的
/**
* 懒汉式 无法传参 多线程会出现多个对象
* Created by lenovo on 2018/3/4.
*/
public class B {
private static B b = null;
private B() {
}
public static B getB() {
if (b == null) {
b = new B();
}
return b;
}
}
懒汉式,相对饿汉式需要时创建,线程不安全
**
* 双重检查 比较常用 多CPU处理的线程会出现不同步问题 加volatile关键字 虚拟机可以屏蔽一些代码的优化保证同步
* Created by lenovo on 2018/3/4.
*/
public class C {
private static volatile C c;
private C() {
}
public static C getC() {
if (c == null) {
synchronized (C.class) {
if (c == null) {
c = new C();
}
}
}
return c;
}
}
/**
* 静态内部类 静态内部类静态属性实例化是由虚拟机JVM来保证线程安全的
* 所以此方式能够延迟加载也能实现线程安全 但是也不能传参
* Created by lenovo on 2018/3/4.
*/
public class D {
private D() {
}
private static class F{
private static D d = new D();
}
public static D getD() {
return F.d;
}
}
/**
* 枚举 枚举只有一个对象实现单例
* Created by lenovo on 2018/3/4.
*/
public enum E {
INSTANCE;
private G instance;
E() {
instance = new G();
}
public G getInstance() {
return instance;
}
}