Spring 单例模式

JVM的工作原理:
A:类加载器:通过类加载器将编译好的字节码文件加载到JVM中。
B:字节码校验器:校验加载过来的字节码的合法,如是否损坏或者被病毒篡改过等。如果校验失败则不会继续执行了。
C:解释器:解释执行字节码生成目标平台的机器码运行。

静态成员在什么时候就存在了?在字节码文件被成功加载到JVM中后就存在了。
实例成员什么时候存在的?在实例化对象后才存在。

静态方法为什么不能访问实例化成员?因为静态方法存在时实例成员可能根本不存在,让一个存在的东西去访问一个根本不存在的东西,逻辑上不通。

设计模式:解决固定问题的固定办法。

单:一个
例:实例(对象)
单例:一个对象
单例设计模式:对外只提供一个对象的设计模式。
单例设计模式的分类:根据对象的实例化时机

饿汉式:
设计步骤:

  • A:声明一个私有的静态的最终的本类类型的对象并实例化
  • B:构造函数私有化
  • C:通过公有的静态方法返回第一个声明并实例化好的对象。
public class Person {

	//1.声明一个私有的静态的最终的本类类型的对象并实例化
	private static final Person instance=new Person();
	
	//2.构造函数私有化
	private Person(){
		
		System.out.println("===Person()==");
	}
	
	//3.通过公有的静态方法返回第一个声明并实例化好的对象。
	public static Person getInstance(){
		return instance;
	}
}

懒汉式:
设计步骤:

  • A:声明一个私有的静态的本类类型的对象
  • B:构造函数私有化
  • C:通过公有的静态方法返回第一步声明的对象。
  • 但是注意:需要判断对象是否实例化过,如果没有实例化则马上实例化,如果已经实例化则直接返回。
public class Pig {

	//1.声明一个私有的静态的本类类型的对象
	private static  Pig instance=null ;
	
	//2.构造函数私有化
	private Pig(){
		System.out.println("===Pig()==");
	}
	
	/**
	 * 3.通过公有的静态方法返回第一步声明的对象,
	 *  但是注意:需要判断对象是否实例化过,如果没有实例化则马上实例化,如果已经实例化则直接返回。
	 *  
	 *  线程同步的实现方式有两种:
	 *  A:同步函数
	 *  B:同步代码块
	 *  
	 *  区别:
	 *  A:同步函数使用的锁是:
	 *  	A:实例方法:this
	 *  	B:静态方法:当前类名.class
	 *  
	 *  B:同步代码块使用的锁是:
	 *  	任意对象
	 *  
	 *  如果想既安全有要求效率高,可以使用双重判断来解决。
	 * @return
	 */
	public static  Pig getInstance(){
		
		if(instance==null){
			synchronized (Pig.class) {
				if(instance==null){
					instance=new Pig();
				}
			}
		}
		
		return instance;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值