单例模式
(读了一篇博文,记一下笔记啦,学习学习嘛。。)
目的:为保证程序的生命周期内一个类的实例只有一个(为什么这样做,当遇到具体问题自会清楚,这里不再赘述)。
直接上代码:
public class demo{
//私有静态全局变量
private static demo onlyclass;
//私有静态全局变量,用来加锁防止多线程情况下,会出现多个类实例。
//当程序中有多个线程时,一个线程进入if从句但还没有new对象时,另一个线程进入此
//时onlyclass还为空,另一个线程又会new一个对象出来,这时违背了单例模式目
//(ps:虽然发生的情况很小,但也不可不防。)
private static object obj = new object();
//私有构造函数,保证在其他类中无法创建该类实例。
private demo(){
//code
}
//共有静态方法,在其他类中调用会创建该类对象
public static demo getInstance(){
//双重检查锁定,可以防止多线程情况下,每次执行getInstance()方法都会
//加锁。(不管onlyclass是否为空都会加锁的,如果都会加锁有那么些许的影响性能。)
if(onlyclass==null){
lock(obj){
if(onlyclass==null){
onlyclass = new demo();
}
}
return onlyclass;
}
}
单例模式之懒汉式:
其实上面介绍的就是懒汉式,为啥叫了“懒汉”呢,其实不是程序不勤快,而是当不调用
getInstance()方法时它就不会创建对象,将程序赋予人的感情,显得有些懒。
单例模式之饿汉式:
饿汉式就是当不调用getInstance()方法时也会创建一个类对象的实例出来,只要加载该类
就会创建出一个对象,显得很是勤快,是不是有点像是肚子饿了。
上代码:
public class demo{
private static demo onlydemo = new demo();
private demo(){
//code
}
public static demo getInstance(){
return onlyclass;
}
}
看完饿汉了那么一定会有一个疑问为什么在饿汉式中不去处理多线程同步的安全问题呢?
这是因为不管是在Java中还是c#中系统会自动处理这些问题。所以饿汉式不用考虑线程安全问题。
但是这样看来是不是“饿汉”要比“懒汉”好呢?这个。。。各有各的好处吧。饿汉式也有缺点,
就是加载类时就new对象,会提前占用系统资源。