java单例模式学习

设计模式,是一种经验的总结(个人理解)形成的不具约束力的规范和实现。

由于java基础的薄弱,对单例模式不太理解,甚至现在再学还是只会学到皮毛,但是还是一点点看和学吧,等某一天了解了其深层次原理的时候才算学通了。

单例模式的目的是保证对象的唯一性,这就需要保证其他程序无法创建对象,且本类创建的对象唯一,只对外提供该类的方法。

保证第一点:构造函数私有化。

保证第二点:在本类中创建对象,且唯一。

保证第三点:提供获取对象的方法,public。

(1)只适合单线程环境

原因:多线程环境下同时判断if可能生成多个对象

public class Test {
	private Test(){}//私有化构造函数
	private static Test test=null;
	public static Test getInstance()//对外提供获取实例的方法
	{
		if(null==test)
		{
			test=new Test();//本类中创建对象
		}
		return test;
	}
}
(2 适合多线程环境(懒汉式)

原因:getInstance()方法加了同步锁

public class Test2 {
	private Test2(){}//私有化构造函数
	private static Test2 test2=null;
	public static synchronized Test2 getInstance()//对外提供获取实例的方法
	{
		if(null==test2)
		{
			test2=new Test2();//本类中创建对象
		}
		return test2;
	}
}
(3)两次判断,加同步锁

原因:当test3为null时才加同步锁创建实例,否则无需获取同步锁

public class Test3 {
	private Test3(){}//私有化构造函数
	private static Test3 test3=null;
	public static Test3 getInstance()//对外提供获取实例的方法
	{
		if(null==test3){
			synchronized (Test3.class) {
				if(null==test3)
				{
					test3=new Test3();//本类中创建对象
				}
			}
		}
		return test3;

	}
}
(4)饿汉式(推荐使用)

原因:加载该类时就生成一个Test4的静态实例(使用到该类的话迟早要创建该实例),但是过早初始化该实例占用内存,达不到lazy loading的目的

public class Test4 {
	private Test4(){}
	private static Test4 test4 = new Test4();
	public static Test4 getInstance()
	{
		return test4;
	}
}

(5)静态内部类(推荐)

还看得不太理解,看懂了补充。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值