Java单例模式

单例模式
保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
单例模式的应用场景:比如windows中的任务管理器、回收站,网站的计数器其他的比如数据据库的连接池,操作系统的文件系统,Servlet编程中的Applicants对象也是,每个Servlet对象也是单例,Spring MVC框架中的控制器对象也是单例。

单例模式优点:
由于单例模式只生成一个实例 ,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、于生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决
单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理

常见的五种单例模式实现方式:
-主要:
●饿汉式(线程安全,调用效率高。 但是,不能延时加载。 )
●懒汉式(线程安全,调用效率不高。但是,可以廷时加载。 )
-其他:
●双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用)
●静态内部类式(线程安全,调用效率高。但是,可以延时加载)
●枚举单例(线程安全,调用效率高,不能延时加载)

饿汉式
(1)私有化构造器
(2)提供一个属性变量(private static)
(3)提供一个public方法


/**
 * 饿汉式单例模式
 * 优点:线程安全,方法没有同步,调用效率高
 * @author 佳哥
 *
 */
public class SingletonDemo01 {
	//(1)私有化构造器(private)
		private SingletonDemo01(){
			
		}
	//(2)提供一个属性变量(private static)实例SD(由于饿汉式非常饥渴,类初始化后立即加载对象(本来就线程安全))
		private static SingletonDemo01 SD = new SingletonDemo01();
	//(3)提供一个public static方法
	
		public static SingletonDemo01 getSD() {
			return SD;
		}

}

懒汉式实现(单例对象延迟加载):
创建实例的时候没有立刻new对象,延迟加载用的时候new,还有在public方法中使用同步块:sychronized,避免高并发的时候创建多个对象

/**
 * 懒汉式单例模式
 * 优点:线程安全,方法同步,资源利用率高
 * 缺点:调用效率低
 * @author 佳哥
 *
 */
public class SingletonDemo02 {
	//(1)私有化构造器(private)
		private SingletonDemo02(){
			
		}
	//(2)提供一个属性变量(private static)实例SD(由于饿汉式非常饥渴,类初始化后立即加载对象(本来就线程安全))
		private static SingletonDemo02 SD = new SingletonDemo02();
	//(3)提供一个public static方法
	
		public static synchronized SingletonDemo02 getSD() {
			if(SD == null) {
				SD = new SingletonDemo02();
			}
			
			return SD;
		}
}

双重检测查锁:不建议使用,在懒汉式中的if语句中加锁,(了解)
静态内部类式(懒加载)
并发高校调用和延迟加载
线程安全,并不会立刻初始化内部类,而是真正调getSD方法的时候才会执行InnerClassNewSD.SD的时候才会初始化内部类

/**
 * 静态内部类实现单例模式
 * @author 方楚佳
 *
 */
public class SingletonDemo03 {
	//(1)私有化构造器(private)
			private SingletonDemo03(){
				
			}
	//(2)静态内部类(创建对象)
			private static class InnerClassNewSD{
				private static final SingletonDemo03 SD = new SingletonDemo03();
			}
	(3)提供一个public static方法返回实例
			public static SingletonDemo03 getSD() {
				//内部类调SD
				return InnerClassNewSD.SD;
			}
}

枚举实现单例

/**
 * 枚举避免反射和反序列化创建 对象的漏洞
 * 没有懒加载
 * @author 佳哥
 *
 */
public enum SingletonDemo04 {
	//枚举元素本身单例
	INSTANT;
	//实现自己的操作
	public void MakeYourself() {
		
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值