天天看点

设计模式(四)单例模式

何为单例模式?

单例模式:当前进程中,单例模式创建的实例对象有且只有一个。

单例模式的特点

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;
    }
}
           

继续阅读