版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/50750731
1.单例模式的定义
确保某一个类中只有一个实例,而且自行实例化并且向整个系统提供一个实例。singleton包下的Singleton是懒汉式单例,Singleton双检查单例,Singleton2饿汉式单例
2.单例模式的使用场景:
确保某个类有且只有一个实例。避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且既有一个。例如创建一个对象需要消耗资源过多,如要访问IO和数据库资源、网络资源,这事就要考虑使用单例
3单例模式的关键点:
(1)构造方法私有化,一般为private(2).通过一个静态方法返回单例对象。
(3)确保单例类对象只有一个,尤其是在多线程的情况下。
(4)确保单例类对象在反序列化时,不重新构建对象。
4.代码实现
4.1懒汉式单例
package singleton;
/**
* 懒汉式单列模式
* @author Administrator
* @优点:单例只有在使用的时候才会初始化化,在一定程度上节约了资源。
* @缺点:第一次加载时需要及时的进行初始化,反应稍微慢,最大的问题是每次调用getInstance
* 都是同步,造成了不必要的开销,一般不建议使用。
*/
public class Singleton {
private static Singleton instance;
private Singleton(){}
//同步方法
public static synchronized Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}
public static void main(String[] args) {
System.out.println();
}
}
4.2双检查单例(DCL)模式
package singleton;
/**
*
* @author lidong
* @优点:既能够在需要的时候初始化单例,又能够保证线程安全。 并且单例对象初始化后调用getInstance不进行同步锁。
* @延迟加载方式
*/
public class Singleton1 {
private static Singleton1 instance = null;
private Singleton1() {
}
public static Singleton1 getInstance() {
if (instance == null) {//避免不必要的同步
synchronized (Singleton1.class) {
if (instance == null) {//为null的时候创建实例
instance = new Singleton1();
}
}
}
return instance;
}
}
3.饿汉式单例
package singleton;
/**
* 饿汉式单例
* @author lidong
* @预先加载方式
*/
public class Singleton2 {
private static Singleton2 instance = new Singleton2();
private Singleton2() {
}
public static Singleton2 getInstance(){
return instance;
}
}
测试类
package singleton;
public class Test {
public static void main(String[] args) {
//饿汉式
Singleton2 s1 = Singleton2.getInstance();
Singleton2 s2 = Singleton2.getInstance();
System.out.println(s1.equals(s2));
//懒汉式
Singleton s3 = Singleton.getInstance();
Singleton s4 = Singleton.getInstance();
System.out.println(s3.equals(s4));
//双枷锁模式
Singleton1 s5 = Singleton1.getInstance();
Singleton1 s6 = Singleton1.getInstance();
System.out.println(s5.equals(s6));
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
System.out.println(s5);
System.out.println(s6);
}
}
结果:
true
true
true
singleton.Singleton2@12b6651
singleton.Singleton2@12b6651
singleton.Singleton@4a5ab2
singleton.Singleton@4a5ab2
singleton.Singleton1@1888759
singleton.Singleton1@1888759
下载地址