【黑马程序员】java中-------------------单例设计模式

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------




Java单例设计模式



一.  定义:


1.  设计一个类,这个类确保只能有一个实例对象,在内存中只存在一个对象,而且向整个系统提供这个对象,成为单例设计模式。


2.如何保证对象唯一性?


a.将构造方法私有化,这样外部就不能使用构造方法new对象了。


b.在类中创建一个本类对象,为了防止外部访问使用这个对象,必须将构造函数私有化。


c. 提供一个静态方法让外部可以通过这个方法获得到本类这个自定义的对象。


3.     懒汉式和饿汉式


饿汉式(此时的对象是随着类加载而加载)
单例设计模式,保证对象的唯一性;

两种方式:1,懒汉式  2,饿汉式 

1  class Student{
		private Student(){}
		prevate  Student  s=new  Student();
		pribulic  static  Student  getStudent(){
			return  s;
		}
}
2  class Single{									
    prevate Single(){}										
	private  static Single getInstance(){						
		if(s==null)									
			s=new Single();										
		return s;										
  }
}
4.多线程中的安全问题

我们发现当一个线程方法时,是没有任何问题,但是多个线程发生并发访问就存在问题了。
假如线程1判断完if(s == null)之后就被CPU切换到另一个线程,线程执行,进来也做完了if(s == null)判断,
此时线程1得到了CPU的执行权,就去new了一个对象,然后线程2也new了一个新的对象,
所以懒汉式的对象延迟加载导致了多线程并发访问产生多个不同对象的问题发生。所以既然是考虑到多线程,
当然我们就要用到多线程同步语句去控制并发访问了。

解决方法:加上同步代码块和双重判断
class Student{
	private Student(){}
	private Student s=new Student();
	public static Student getStudent(){
		if(s==null){
			synchronized(student.class){
				if(s==null){
					s=new Student();
				}
			}
		}
		return s;
	}
}	

5、在实际开发中,建议使用饿汉式,因为在开发中,要用到单例设计模式的话,对象不管怎么样都是要建立的

而且在饿汉式中,没有线程安全问题,效率要比懒汉式高些 




---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值