单类模式

来源:互联网 发布:mysql deadlock 编辑:程序博客网 时间:2024/04/28 17:30

单类模式,确保某一个类只能有一个实例,而且自行实例化并向整个系统提供这个实例,通用代码为:

public class Singleton {    private static final Singleton singleton=new Singleton();    private Singleton(){    }    public static Singleton getSingleton(){        return singleton;    }    public static void doSomething(){    }}

懒汉式单例类:在第一次被引用的时候,才会将自己实例化,这种方式不安全,只适用于单线程。

public class Singleton{    private static Singleton singleton=null;    private Singleton(){    }    public static Singleton getSingleton(){        if(singleton==null)            singleton=new Singleton();        return singleton;    }}

对上述实现加同步,加同步锁

public class Singleton{    private static Singleton singleton=null;    private Singleton(){    }    public static synchronized Singleton getSingleton(){        if(singleton==null){            singleton=new Singleton();        }        return singleton;    }}

这样每次在调用getSingleton()方法时都需要同步,而加锁是一个非常耗时的操作,会影响性能,所以考虑双重锁定,因为双重锁定不是线程安全的,所以若要用这种方法,需要使用volatile关键字。只有在实例为null即没有创建时,需要加锁操作,当实例已经创建出来之后,则无需加锁,两次判断singleton==null的原因:当singleton为null并且同时有两个线程调用getSingleton()方法时,他们可以通过第一重singleton==null的判断,然后由于synchronized机制,这两个线程只有一个进入,另一个在外排队等候,必须要其中一个进入并出来后,另一个才能进入。而此时如果没有了第二重singleton==null,则第一个线程创建了实例,而第二个线程还是可以继续再创建新的实例,这就没有达到单例的目的。

public class Singleton{    private static volatile Singleton singleton=null;    private Singleton(){    }    public static Singleton getSingleton(){        if(singleton==null){   //            synchronized(Singleton.class){                if(singleton==null){                    singleton=new Singleton();                }            }        }        return singleton;    }}

利用静态内部类的方式实现

public class Singleton{    private static class LazyHolder{        private static final Singleton singleton=new Singleton();    }    private Singleton(){    }    public static final Singleton getSingleton(){        return LazyHolder.singleton;    }}

饿汉式单例类:在类被加载的时候将自己实例化,所以要提前占用系统资源,因为它是在类创建的同时已经创建好的一个静态的对象供系统使用,以后不再改变,所以是天生线程安全的

public class Singleton{    private Singleton(){    }    private static final Singleton singleton=new Singleton();    public static Singleton getSingleton(){        return singleton;    }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手指没指纹怎么办身份证 青岛身份证丢了怎么办 新身份证没激活怎么办 坐轻轨没身份证怎么办 办身份证指纹录不上怎么办 指纹固化剂干了怎么办 指纹解锁没反应怎么办 荣耀v8指纹失灵怎么办 指纹多次不匹配怎么办 华为指纹被禁用怎么办 手脱皮没有指纹怎么办 手脱皮手机指纹怎么办 手脱皮录指纹怎么办 科二指纹打不上怎么办 三星手机无法解锁怎么办 iphone7指纹坏了怎么办 苹果8录不上指纹怎么办 手机套总是粘指纹怎么办 华为p9指纹禁用怎么办 华为p10升级失败怎么办 手机指纹锁没反应怎么办 华为手机指纹禁用怎么办 excel输入值非法怎么办 excel表数字乱码怎么办 excel表格打不开了怎么办 表格中数字乱码怎么办 手机颜色变了怎么办 身份证上的字母怎么办 身份证被盗用贷款怎么办 刑拘在逃不归案怎么办 在逃人员抓不到怎么办 卖假烟被网上追逃怎么办? 同事贷款不还怎么办 支付宝怎么办信用卡2 钱站逾期一天怎么办 蚂蚁借呗逾期怎么办 网贷全面爆发怎么办 着急用1200块钱怎么办 黑户有车怎么办贷款 安逸花合同到期怎么办 重庆按揭车怎么办贷款