单例模式
来源:互联网 发布:sql select 结果 左链 编辑:程序博客网 时间:2024/06/05 15:42
自以为拥有财富的人,其实是被财富所拥有。
本讲内容:单例模式
一、单例模式Singleton
1、应用场合:有些对象只需要一个就足够了,如古代皇帝,如配置文件、工具类、线程池、缓存、日志对象等
2、作用:保证整个应用程序中某个实例有且只有一个(如果创造出多个实例,就会导致很多问题,占用资源过多,不一致的结果等)
3、类型:饿汉模式和懒汉模式
区别:
饿汉模式的特点是加载类时比较慢,但运行时获取对象的速度比较快,线程安全
懒汉模式的特点是加载类时比较快,但运行时获取对象的速度比较慢,线程不安全
示例一:
/** * 饿汉模式:随着类的加载就创建了唯一的实例 */public class Singleton {//1.将构造方法私有化,不允许外部直接创建对象private Singleton(){}//2.创建类的唯一实例,使用private static修饰private static Singleton instance=new Singleton();//3.提供一个用于获取实例的方法,使用public static修饰public static Singleton getInstance(){return instance;}}
/** * 懒汉模式:只有第一次调用共有方法时才创建唯一的实例 */public class Singleton2 {//1.将构造方式私有化,不允许外边直接创建对象public Singleton2() {}//2.声明类的唯一实例,使用private static修饰private static Singleton2 instance;//3.提供一个用于获取实例的方法,使用public static修饰public static Singleton2 getInstance(){if(instance==null){instance=new Singleton2();}return instance;}}
懒汉模式是线程不安全的,如果现在有两个线程同时在执行getInstance方法,第一个线程刚执行完第14行,还没执行第15行,这个时候第二个线程执行到了第14行,它会发现sLogUtil还是null,于是进入到了if判断里面。这样你的单例模式就失败了,因为创建了两个不同的实例。也可以通过双重锁定方法解决
public static Singleton2 getInstance(){if(instance==null){synchronized(Singleton2.class){if(instance==null){instance=new Singleton2();}}}return instance;}
public synchronized static Singleton2 getInstance(){if(instance==null){instance=new Singleton2();}return instance;}
/** *测试类 */public class test {public static void main(String[] args) {//饿汉模式Singleton s1=Singleton.getInstance();Singleton s2=Singleton.getInstance();if(s1==s2){System.out.println("s1和s2是同一个实例");}else{System.out.println("s1和s2不是同一个实例");}// 懒汉模式Singleton2 s3 = Singleton2.getInstance();Singleton2 s4=Singleton2.getInstance();if(s3==s4){System.out.println("s3和s4是同一个实例");}else{System.out.println("S3和s4不是同一个实例");}}}
打印:
s1和s2是同一个实例s3和s4是同一个实例
示例二:一个能够控制打印级别的日志工具类
public class LogUtil {private static final int VERBOSE = 1;private static final int DEBUG = 2;private static final int INFO = 3;private static final int WARN = 4;private static final int ERROR = 5;private static final int NOTHING = 6;private static final int LEVEL = VERBOSE;private static LogUtil instance = new LogUtil();private LogUtil() {}public static LogUtil getInstance() {return instance;}public static void v(String tag, String msg) {if (VERBOSE >= LEVEL) {Log.v(tag, msg);}}public static void d(String tag, String msg) {if (DEBUG >= LEVEL) {Log.d(tag, msg);}}public static void i(String tag, String msg) {if (INFO>= LEVEL) {Log.i(tag, msg);}}public static void w(String tag, String msg) {if (WARN >= LEVEL) {Log.w(tag, msg);}}public static void e(String tag, String msg) {if (ERROR >= LEVEL) {Log.e(tag, msg);}}}
通过这个类来打印日志,只需要控制level的级别,就可以自由地控制打印的内容。比如现在项目处于开发阶段,就将level设置为DEBUG,这样所有的日志信息都会被打印。而项目如果上线了,可以把level设置为INFO,这样就只能看到INFO及以上级别的日志打印。如果你只想看到错误日志,就可以把level设置为ERROR。而如果你开发的项目是客户端版本,不想让任何日志打印出来,可以将level设置为NOTHING(项目上线时)。打印的时候只需要调用:
LogUtil.getInstance().d("TAG","debug log");
1 0
- 单例、单例模式
- 单例模式-多线程单例模式
- 单件模式(单例模式)
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- PHP模式-单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 单例模式(单子模式)
- 设计模式-单例模式
- [设计模式] 单例模式
- x210v3开发板u-boot-2012.10移植之九---运行阵地转移,赶紧把BL2扔到内存
- [LeetCode]Max Points on a Line
- Hibernate学习笔记之三种查询方式
- Laravel控制器调用model的两种方法
- poj 1269 Intersecting Lines
- 单例模式
- 中缀表达式转后缀表达式的步骤描述
- x210v3开发板u-boot-2012.10移植之十---串口摇身一变控制台
- 黑马程序员——java基础——集合框架(一:单列集合(Collection体系))
- Python之正则表达式进阶篇
- OOAD 学习笔记 十
- poj 1655 树形dp
- GIS空间分析 对栅格数据分析,距离分析,点位置查找
- 第一个maven构建