Java基础:设计模式:单例设计模式:以Runtime这个类的底层源码为例---饿汉式 和 懒汉式

设计模式一共有23种,(java出生30多年了,才总结出这23种!)
设计模式是前辈们总结程序中发生的各种问题,为解决这些问题,而设计出的规章制度,方式方法,都是智慧的结晶。

首先说说单例设计模式: (一个类中只能创建出一个这个类的类对象)
体现单例设计模式最经典的地方,就是在Runtime这个类的底层代码中:
在这里插入图片描述
1.首先,Runtime这个类把它的构造方法给private了,这样别人就没法随意去创建Runtime类型的对象了。
但也不能闭关锁国,别人要真想用一下Runtime的对象,咋整呢?
2.Runtime类在自己内部new了一个自己的类对象,还是static的
3.然后给大家提供了一种方式去调用它的类对象: 大家可以去.getRuntime() 就可以得到Runtime的类对象了

Runtime只创建这一个类对象 currentRuntime,它可以被调用无数次,但也只是调用的它自己一个人。

手写单例模式:(面试题)

方式一:(工作中用,但面试不考)
饿汉式
优点:没有安全隐患,因为本模式中 线程们 访问的资源 是 MySingleton这个对象,它只在第3步中被调用过,(多线程状态下,同一个资源要在2处以上调用过才会有线程安全隐患),所以没有安全隐患。
缺点:这种形式下,MySingleton对象创建出来得太早了,由于它是静态资源,很占资源;并且类一加载,它就加载出来了,不管有没有外界调用它,它会一直在那,直到最后才消失,如果整个过程没人调用它,它就一直占着内存,(占着坑不拉屎)。

poublic class TestSingleton{
	public static void main(String[] args){
		
		//4.通过类名.getMySingleton()  得到MySingleton类对象
		MySingleton mySingleton1 = MySingleton.getMySingleton();
		MySingleton mySingleton2 = MySingleton.getMySingleton();
		System.out.println(mySingleton1 == mySingleton2); //结果为true,说明mySingleton1 和mySingleton2 指向的是同一块内存空间,即指向的都是那个MySingleton的单例对象
	}
}
//饿汉式
class MySingleton{
	//1.将构造方法私有
	private MySingleton(){}
	
	//2.新建MySingleton类对象 ,也是private  和 static
	private static MySingleton mySingleton  = new MySingleton();
	
	//3.向外界提供调用类对象的方法 ,也是 static的
	public static  MySingleton getMySingleton(){
		return mySingleton;
	}	
}

方式二:(工作中用得少,但面试中考的多)
懒汉式
优点:
共享对象singleton2不用早早地就new出来占资源,什么时候外界调用getSingleton2()了,再在这个方法中创建出singleton2对象就行。
但注意要在成员变量区把singleton2定义成static的,要不然要是像通常那样写在getSIngleton2()中,每个线程调用这个方法时,都会new出一个singleton2对象,就不是单例模式了!
缺点:
有安全隐患: 被线程们共享的对象singleton2 在程序中有3处被用到了,所以有线程安全隐患。
(判断一个程序有没有线程安全隐患:
1.是不是多线程程序
2.被共享的资源是不是在程序中被调用2次或2次以上)

public class TestSingleton2{
	public staitc void main(String[] args){
		MySingleton2 mySingleton2 = MySingleton2.getMySingleton2();
		MySingleton2 mySingleton22 = MySingleton2.getMySingleton2();
		System.out.println(mySingleton2 == mySingleton22);  //结果为true 说明MySingleton2确实是单例对象
	} 
}
//懒汉式
class MySingleton2{
	//1.把构造方法private掉
	private MySingleton2(){}

	//2.定义静态的变量MySingleton2
	private static MySingleton2 mySingleton2;

	//3.提供一个getMySingleton2()方法,让线程们调用,并在第一个人调用后,创建出一个对象,成为了单例的全局静态对象,供大家使用
	synchronized public static MySingleton2 getMySingleton2(){
		if(mySingleton1 == null){ //第1次调用
			singleton2 = new MySingleton2(); //第2次调用
		}
		return singleton2;3次调用  所以有线程安全隐患,所以加了锁,加到了方法上。
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值