美文网首页程序猿进化之路Java学习资料分享
Java单例设计模式的理解与常规实现方式

Java单例设计模式的理解与常规实现方式

作者: 编程说书酱 | 来源:发表于2018-12-20 16:13 被阅读0次

1:Java中单例模式是一种常见的设计模式,单例模式有以下特点:

      单例类只能有一个实例。

      单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。

  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

2:java中单例模式的写法也有很多种,我在这里列举几张常用的方式:

     1、饿汉式,线程安全 但效率比较低:

/**

* 单例模式的实现:饿汉式,线程安全 但效率比较低

*/publicclassSingletonTest{// 定义一个私有的构造方法privateSingletonTest(){      }// 将自身的实例对象设置为一个属性,并加上static和final修饰符privatestaticfinalSingletonTest instance =newSingletonTest();// 静态方法返回该类的实例publicstaticSingletonTestgetInstancei(){returninstance;      }    }

     2、懒汉式,非线程安全:

/** 

* 单例模式的实现:懒汉式,非线程安全 

*/publicclassSingletonTest{// 定义私有构造方法(防止通过 new SingletonTest()去实例化)privateSingletonTest(){      }// 定义一个SingletonTest类型的变量(不初始化,注意这里没有使用final关键字)privatestaticSingletonTest instance;// 定义一个静态的方法(调用时再初始化SingletonTest,但是多线程访问时,可能造成重复初始化问题)publicstaticSingletonTestgetInstance(){if(instance ==null)              instance =newSingletonTest();returninstance;      }  }

     3、懒汉式,线程安全简单实现  :

/** 

* 单例模式的实现:懒汉式,线程安全简单实现 

*/publicclassSingletonTest{// 定义私有构造方法(防止通过 new SingletonTest()去实例化)privateSingletonTest(){      }// 定义一个SingletonTest类型的变量(不初始化,注意这里没有使用final关键字)privatestaticSingletonTest instance;// 定义一个静态的方法(调用时再初始化SingletonTest,使用synchronized 避免多线程访问时,可能造成重的复初始化问题)publicstaticsynchronizedSingletonTestgetInstance(){if(instance ==null)              instance =newSingletonTest();returninstance;      }  }

     4、线程安全 并且效率高  单例模式最优方案

/** 

* 单例模式最优方案

* 线程安全  并且效率高 

*/publicclassSingletonTest{// 定义一个私有构造方法privateSingletonTest(){          }//定义一个静态私有变量(不初始化,不使用final关键字,使用volatile保证了多线程访问时instance变量的可见性,避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用)privatestaticvolatileSingletonTest instance;//定义一个共有的静态方法,返回该类型实例publicstaticSingletonTestgetIstance(){// 对象实例化时与否判断(不使用同步代码块,instance不等于null时,直接返回对象,提高运行效率)if(instance ==null) {//同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建)synchronized(SingletonTest.class) {//未初始化,则初始instance变量if(instance ==null) {                    instance =newSingletonTest();                  }              }          }returninstance;      }  }

     5、静态内部类方式

/**

  * 静态内部类方式

  *

  */publicclassSingleton{privatestaticclassSingletonTest{privatestaticfinalSingleton INSTANCE =newSingleton();      }privateSingleton(){}publicstaticfinalSingletongetInstance(){returnSingletonTest.INSTANCE;      }  }

以上单例如设计模式即使有多重检查锁也可以通过反射破坏单例

   6、目前最为安全的实现单例的方法是通过内部静态enum的方法来实现,因为JVM会保证enum不能被反射并且构造器方法只执行一次,事例如下:

/** * 使用枚举的单例模式 * *@authoruu */publicclassEnumSingleton{privateEnumSingleton(){}publicstaticEnumSingletongetInstance(){returnSingleton.INSTANCE.getInstance();    }privatestaticenumSingleton{        INSTANCE;privateEnumSingleton singleton;//JVM会保证此方法绝对只调用一次privateSingleton(){            singleton =newEnumSingleton();        }publicEnumSingletongetInstance(){returnsingleton;        }    }publicstaticvoidmain(String[] args){    EnumSingleton obj0 = EnumSingleton.getInstance();    EnumSingleton obj1 = EnumSingleton.getInstance();//输出结果:obj0==obj1?trueSystem.out.println("obj0==obj1?"+ (obj0==obj1));  }}

在此浅谈一下个人理解,希望对大家有所帮助。

相关文章

网友评论

    本文标题:Java单例设计模式的理解与常规实现方式

    本文链接:https://www.haomeiwen.com/subject/qqoykqtx.html