单例模式
来源:互联网 发布:剑三代练淘宝下单好吗 编辑:程序博客网 时间:2024/06/05 07:05
单例模式有很多种,在这里就介绍三种:懒汉式单列,饿汉式单列,登记式单列。
单列模式有一下几个特点:1.单例类只能有一个实例 2.单例类必须自己创建自己的唯一实例 3.单例类必须为其他所有对象提供这一实例
目的:就是为了避免不一致的状态
一.懒汉式单例
//懒汉式单例,在第一次调用的时候实例化自己
public class singleton{
private singleton(){};
private static singleton single=null;
private static singleton getInstence(){
if(single==null){
single=new singleton();
}
return single;
}
}
singleton将类构造方法设置为private为了避免被外部类实例化,在同一个虚拟机的范围内,singleton的唯一实例只能通过getInstence得到。
(事实上,java的反射机制能够实现构造方法为private类的),懒汉式方法的线程是极其不安全的,通过:
1.在getInstence方法上加上同步
public static synchronized singleton getInstence(){
if(single==null){
single=new singleton();
}
return single;
}
2.双重检查锁定
public static singleton getInstence(){
if(single==null){
single=new singleton();
}
return single;
}
3.静态内部类
public class singleton(){
private static class LazyHolder{
private static final singleton INSTENCE =new singleton();
private singleton();
public static final singleton getInstence(){
return LazyHolder.INSTENCE;
}
}
}
这种方法比上面的那两种性能上要更好一些
二.饿汉式单例
//饿汉式单例在类初始化的时候已经自行实例化
public static singleton2{
private singleton2();
private static final singleton2 single2=new singleton2(();
//静态工厂方法
public static singleton2 getInstence(){
return single2;
}
}
饿汉式在类创建的时候就已经创建好一个静态的的对象供系统使用,以后不再改变所以线程是安全
三.登记式单例
//类似spring里面的方法,将类名注册,下次直接从里面获取。
public class singleton3{
private static Map<String,singleton3> map=new HashMap<String,singleton3>();
static{
singleton3 single=new soingleton3();
map.put(single.getClass().getName(),single);
//保护的默认的构造子方法
protected singleton3();
//静态工厂方法,返回此类的唯一实例
public static singleton3 getInstence(String name){
if(name==null){
name=singleton3.class.getName();
if(map.get(name)==null){
map.put(name,Class.forname(name).newInstence());
}
return map.get(name);
}
}
}
}
- 单例、单例模式
- 单例模式-多线程单例模式
- 单件模式(单例模式)
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- PHP模式-单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 单例模式(单子模式)
- 设计模式-单例模式
- [设计模式] 单例模式
- Android N之SurfaceFlinger流程解析(6)
- SqueezeNet运用到Faster RCNN进行目标检测+OHEM
- angularJs 取<input type='file'>中文件名 (ng-model获取不了)
- 归并排序
- 排序学习
- 单例模式
- Bridge 模式
- Simplify Path
- codeforces 743D Chloe and pleasant prizes (DFS/树形DP)
- java多线程(第二种方式)
- 【Android 开发入门】android studio 控制台打印输出日志
- 2016.12.17 看看当当网
- Mac下配置php7运行环境
- 详解java类的生命周期