介绍:

所谓单例模式就是采用一定的方法保证在整个系统的运行中,对某个类只能存在一个实例对象,并且该类只提供一个对外暴露的获取实例对象的静态方法
单例模式的八种写法

饿汉式(静态常亮)

  1. private Single(){}
  2. private final static Single single = new Single();
  3. public static Single getInstance(){
  4. return single;
  5. }

分析:
优点:类加载就创建了,是线程安全的
缺点:当系统用不到的时候,就会占用系统内存

饿汉式(静态代码快)

  1. private Single(){}
  2. private static Single single;
  3. static {
  4. single = new Single();
  5. }
  6. public static Single getInstance(){
  7. return single;
  8. }

分析:
优点:类加载就创建了,是线程安全的
缺点:当系统用不到的时候,就会占用系统内存

懒汉式(线程不安全)

  1. public class Single {
  2. private Single(){}
  3. private static Single single;
  4. public static Single getInstance(){
  5. if (null == single){
  6. return new Single();
  7. }
  8. return single;
  9. }
  10. }

分析:
优点:起到了懒加载的效果,但是只能在单线程下使用
缺点:多线程下线程不安全 实际开发中不建议使用

懒汉式(线程安全,同步方法)

  1. public class Single {
  2. private Single(){}
  3. private static Single single;
  4. public static synchronized Single getInstance(){
  5. if (null == single){
  6. return new Single();
  7. }
  8. return single;
  9. }
  10. }

分析:
优点:起到了懒加载的效果,是线程安全的
缺点:synchronized是重量级锁,每次获取都要获取锁影响系统性能 在开发中不建议使用

懒汉式(线程不安全 同步代码块)

  1. public class Single {
  2. private Single(){}
  3. private static Single single;
  4. public static Single getInstance(){
  5. if (null == single){
  6. synchronized(Single.class){
  7. return new Single();
  8. }
  9. }
  10. return single;
  11. }
  12. }

分析:
优点:起到了懒加载的效果
缺点:多线程下,线程不安全 在开发中不建议使用

懒汉式(双重检查)

  1. public class Single {
  2. private Single(){}
  3. private static Single single;
  4. public static Single getInstance(){
  5. if (null == single){
  6. synchronized(Single.class){
  7. if (null ==single) {
  8. return new Single();
  9. }
  10. }
  11. }
  12. return single;
  13. }
  14. }

分析:
优点:起到了懒加载的效果,且是线程安全的 在实际开发中推荐使用

静态内部类

  1. public class Single {
  2. private Single(){}
  3. private static class SingleInstance{
  4. private final static Single single = new Single();
  5. }
  6. public static Single getInstance(){
  7. return SingleInstance.single;
  8. }
  9. }

分析:
这种方式采用了类装载机制来保证初始化实例只有一个线程,类加载时不会加载静态内部类,当首次访问时才会调用类装载机制接在静态内部类。
优点:线程安全,利用静态内部类特点实现延迟加载,效率高 推荐使用

枚举

  1. public enum Single {
  2. SINGLE;
  3. public static Single getInstance(){
  4. return SINGLE;
  5. }
  6. }