java单例模式的几种实现方式

(1)饿汉模式(线程安全、调用效率高、但不能延时加载)

package com.si.single1;

/*
 * 饿汉式
 * 立即创建
 * 线程安全
 * */
public class SingleDemo {

	private static SingleDemo instance = new SingleDemo();

	// 构造器私有化
	private SingleDemo() {
	}

	// 创造公有方法调用instance
	public static SingleDemo getInstance() {
		return instance;
	}
}

一上来就把单例对象创建出来了,要用的时候直接返回即可,这种可以说是单例模式中最简单的一种实现方式。但是问题也比较明显。单例在还没有使用到的时候,初始化就已经完成了。也就是说,如果程序从头到位都没用使用这个单例的话,单例的对象还是会创建。这就造成了不必要的资源浪费。所以不推荐这种实现方式。

(2)懒汉式(线程不安全,调用效率不高,但是能延时加载):

package com.si.single1;

/*
 * 懒汉式
 * 使用的时候才会创建
 * 线程不安全
 * */
public class SingleDemo1 {

	private static SingleDemo1 instance;

	// 构造器私有化
	private SingleDemo1() {
	}

	// 调用的时候才会创建实例,两个以上线程同时进入时,线程不安全
	public static SingleDemo1 getInstance() {
		if (instance == null) {
			instance = new SingleDemo1();
		}
		return instance;
	}
}

(3)加锁懒汉式(线程安全,调用效率不高,但是能延时加载):

package com.si.single1;

/*
 * 加锁懒汉式
 * 使用的时候才会创建
 * 线程安全
 * */
public class SingleDemo1 {

	private static SingleDemo1 instance;

	// 构造器私有化
	private SingleDemo1() {
	}

	// 调用的时候才会创建实例,两个以上线程同时进入时,线程安全
	public static synchronized SingleDemo1 getInstance() {
		if (instance == null) {
			instance = new SingleDemo1();
		}
		return instance;
	}
}

 

(4)Double CheckLock实现单例:DCL也就是双重锁判断机制-双重验证懒汉式(由于JVM底层模型原因,偶尔会出问题,不建议使用):

package com.si.single1;

//DCL(双重验证懒汉式)
public class SingleDemo2 {

	private static SingleDemo2 instance;

	private SingleDemo2() {}

	public static SingleDemo2 getInstance() {
		if (instance == null) {
			// 改进加锁懒汉式,锁加在if判断语句后,可减少锁的使用
			synchronized (SingleDemo2.class) {
				if (instance == null) {
					instance = new SingleDemo2();
				}
			}
		}
		return instance;
	}
}

(5)静态内部类实现模式(线程安全,调用效率高,可以延时加载)

package com.si.single1;

public class SingleDemo3 {

	private SingleDemo3() {
	}

	// 创建内部类
	private static class Inner {
		private static SingleDemo3 instance = new SingleDemo3();
	}

	// 创建公有方法,使用的时候调用
	public static SingleDemo3 getInstance() {
		return Inner.instance;
	}
}

(6)枚举类

package com.si.single1;

public class SingleDemo4 {

	private SingleDemo4() {
	}

	// 创建枚举类
	private static enum Inner {
		INSTANCE;
		// 此处定义的实例不能用static修饰,因为在构造器中会对其进行初始化。
		private SingleDemo4 instance;

		private Inner() {
			instance = new SingleDemo4();
		}

		// 此方法不能用static修饰,静态方法不能调用非静态变量。
		public SingleDemo4 getInstance() {
			return instance;
		}
	}

	// 外部调用方法
	public static SingleDemo4 getInnerInstance() {
		return Inner.INSTANCE.getInstance();
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值