单例模式

三种单例模式

1.懒汉式(饱汉式)单例模式
package com.lanou.singleton;

//懒汉(饱汉)模式
public class LazySinglton {
	
	private static LazySinglton instance;
	
	private LazySinglton() {
		
	}
	public static LazySinglton getInstance() {
		if(instance==null) {
			instance=new LazySinglton();
		}
		return instance;
	}
	
}

2.饿汉式单例模式
package com.lanou.singleton;

//饿汉模式
public class Hungrysingleton {
	private Hungrysingleton() {

	}

	private static Hungrysingleton instance = new Hungrysingleton();

	public static Hungrysingleton getInsatance() {
		return instance;

	}
}

3.双重检查锁的单例模式
package com.lanou.singleton;

//双重检查锁的单例模式
public class DoubleCheckSingleton {
	private DoubleCheckSingleton() {
		
	}

	private static DoubleCheckSingleton instance;

	public static DoubleCheckSingleton getInstance() {
		if(instance==null) { //第一重检查:检查对象是否存在
			synchronized (instance) {
				if (instance == null) {  //第二重检查:对象不存在的情况下,保证创建对象时线程安全
					instance = new DoubleCheckSingleton();
				}			
			}	
		}
		return instance;
	}
}

三种模式的比较:
①懒汉式单例模式,

优点:设计也是比较简单的,和饿汉式不同,当这个Singleton被加载的时候,被static修饰的静态变量将会被初始化为null,这个时候并不会占用内存,而是当第一次调用getInstance方法的时候才会被初始化实例对象,很显然,这种方式是按需创建。
缺点:在单线程环境下是没有问题的,在多线程环境下,会产生线程安全问题。	

②饿汉式单例模式:

优点:设计简单,不存在多线程安全问题。
缺点:当Singleton类被加载的时候,静态代码就会被初始化,那么就意味会去创建实例对象并且分配内存空间,那么之后呢,不管这个实例对象用不用,都会占据内存空间。当我们将一个很大的对象通过饿汉式的方式去设计的时候,显然是不太合适的。

③双重检查锁的单例模式

优点:效率高,线程安全。
缺点:第一次创建对象的时候,速度慢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值