---------------------- <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>、期待与您交流! ----------------------