单例模式

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">一、定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。</span>

二、表现形式:1、饿汉式单例类:类加载时,就进行对象实例化

                            2、懒汉式单例类:第一次引用类时,才进行对象实例化

饿汉式:

package singleton;

public class EHanSingleton {
	private static EHanSingleton e_instance=new EHanSingleton(); //类被加载时e_instance会被初始化
	private EHanSingleton()//构造函数是private的,避免外界利用构造函数直接创建新的其他实例
	{
		
	}
	
	public static EHanSingleton getInstance()
	{
		return e_instance;
	}
}
懒汉式:
package singleton;

public class LHanSingleton {
	private static LHanSingleton l_instance=null;//没有调用前不会实例化LHanSingleton
	private LHanSingleton()//构造函数是private的,避免外界利用构造函数直接创建新的其他实例
	{
		
	}
	
	synchronized public static LHanSingleton getInstance(String name)
	{
		if(l_instance==null)
		{
			l_instance=new LHanSingleton();//第一次调用时实例化
		}
		System.out.println(name+":访问懒汉式");
		return l_instance;
		
	}

}


三、两者的区别:1、饿汉式在类加载时实例化,懒汉式在第一次引用时实例化

                               2、资源利用效率(饿汉式<懒汉式),速度和反应时间(饿汉式>懒汉式)

四、优缺点

优点:1、减少了内存的开支

            2、减少了系统的性能开销

            3、避免对资源的多重占用

            4、可以在系统设置全局的访问点,优化和共享资源访问

缺点:1、无法创建子类,扩展困难,只有通过修改代码进行扩展

             2、对测试不利

             3、与单一职责原则有冲突

五、使用场景

1、要求生成唯一序列号的环境

2、需要共享访问点或共享数据

3、创建对象系需要消耗大量资源

4/需要定义大量静态变量和方法的环境

六、注意事项

1、注意有状态和无状态单例类的使用场景,则单例类是否具有唯一序列号对系统的影响(在分布式系统)

2、单例类不能实现Serializable或Cloneable接口,否则可能被反序列化或克隆出一个新的实例来。

七、应用测试

1、通过线程访问单例类

package singleton;

public class MyThread extends Thread {
	
		private String threadname;
		public MyThread (String name)
		{
			threadname=name;
		}
		public void run()
		{
		
				LHanSingleton instance =LHanSingleton.getInstance(threadname);
				//EHanSingleton instance1 =EHanSingleton.getInstance();
				try
				{
					this.sleep(1000);
				}
				catch(Exception e)
				{
				e.printStackTrace();	
				}
			}
	
		

}
测试类
package singleton;

public class Test {

	public static void main(String[] args) {
		int times=0;
		while(times<10)
		{
		MyThread thread1=new MyThread("线程1");
		MyThread thread2=new MyThread("线程2");
		thread1.start();
		thread2.start();
		times++;
		}
	}

}


测试结果:

线程2:访问懒汉式
线程1:访问懒汉式
线程1:访问懒汉式
线程1:访问懒汉式
线程1:访问懒汉式
线程2:访问懒汉式
线程1:访问懒汉式
线程1:访问懒汉式
线程2:访问懒汉式
线程2:访问懒汉式
线程1:访问懒汉式
线程2:访问懒汉式
线程2:访问懒汉式
线程1:访问懒汉式
线程2:访问懒汉式
线程2:访问懒汉式
线程1:访问懒汉式
线程1:访问懒汉式
线程2:访问懒汉式
线程2:访问懒汉式


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值