且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Java 单例模式的使用

更新时间:2022-07-04 00:49:42

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

下载地址