java设计模式中的单例模式问题

单例模式:

 (1) 目的:保证某个类中只有一个实例存在;(管理器和控制器)

 (2) 三大特点:

  ① 线程安全;

  ② 延时加载;

  ③ 序列化和反序列化;

 (3) 优点:避免实例对象的重复创建(可能是代码最少的模式,但是要慎用)

 (4) 恶汉模式:

  ① 实现方法:

//恶汉模式:无无论需不需要,我都实例化(调用构造方法),以备调用
class singleEHan{
	//创建静态实例
	private static singleEHan single = new singleEHan();
	//private构造方法
	private singleEHan() {
	}
	//返回类自身
	public singleEHan eHanMethod() {
		return single;
	}
}

 类:private构造方法(保证其他类不能实例化),静态实例返回给调用者。

  ② 优点:最简单,类加载时只创建一次实例

  ③ 缺点:类加载就创建,如不用,则内存浪费

  ④ 适用场景:在初始化就被用到的情况(内存小)。

 (5) 懒汉模式:

  ① 实现方法:

  单线程:

  

//懒汉模式:针对多个线程调用
public class singleLanHan {
	//创建自身被调用的静态对象
	private static volatile singleLanHan singleLanHan = null;
	//private构造方法
	private singleLanHan() {
	}
	//在该方法中实例化new
	public singleLanHan lanHanMethod() {
	 if (singleLanHan == null) {
		singleLanHan = new singleLanHan();
	 }
	//若创建,则返回本例
	return singleLanHan;
	}
}

  考虑线程安全(双重校验锁,和volatile关键字):

  (如若使用sychronized修饰同步方法,则比较慢,性能损耗较大)

   1) 双重校验锁(进行两次null检查):解决了线程安全问题、实现延时加载,同时也解决了效率问题。

   2) volatile关键字:“可见性”,禁止指令重排。

//懒汉模式:针对多个线程调用(双重校验锁+volatile)
public class singleLanHan {
	//创建自身被调用的静态对象
	private static volatile singleLanHan singleLanHan = null;
	//private构造方法
	private singleLanHan() {
	}
	//在该方法中实例化new
	public singleLanHan lanHanMethod() {
		//校验锁同步
		if (singleLanHan == null) {
			synchronized (singleLanHan.class) {
				if (singleLanHan == null) {
					singleLanHan = new singleLanHan();
				}
			}
		}
		//若创建,则返回本例
		return singleLanHan;
	}
}

  ② 优点:需要的时候再创建;

 (6) 静态内部类:

  ① 实现方案:

//内部静态类:
public class singleInner {
	//静态类private
	private static class innerClass{
		//实例化,调用构造方法
		private static singleInner single= new singleInner();
	}
	//构造方法
	private singleInner() {
	}
	//返回自身
	public static singleInner innerMethod() {
		return innerClass.single;
	}
}

  ② 思想:在内部类中创建对象实例;

  ③ 优点:只要应用中不使用内部类,JVM就不会加载,因此实现了延时加载和线程安全。

 (7)  枚举(Effective Java推荐,Android不推荐)

  ① 实现方案:

//枚举
public enum singleEnum {
	single;
	public void method() {
	}
}

 ② 优点:提供了自动序列化机制。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值