单例模式介绍
** 意图 **:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
** 主要解决 **:一个全局使用的类频繁地创建与销毁。
** 何时使用 **:当您想控制实例数目,节省系统资源的时候。
** 如何解决 **:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
** 关键代码 **:构造函数是私有的。
** 优点 **:
- 在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
- 避免对资源的多重占用(比如写文件操作)。
** 缺点 **:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
** 使用场景 **:
- 要求生产唯一序列号。
- WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
- 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。
实现方式
饿汉式(静态常量)【可用】
** 代码实现 **:
1 | package main.java.com.study.designPatterns.single; |
** 测试类 **:
1 | package main.java.com.study.designPatterns.single; |
** 输出结果 **:
饿汉式(静态代码块)【可用】
** 代码实现 **:
1 | package main.java.com.study.designPatterns.single; |
** 测试类 **:
1 | package main.java.com.study.designPatterns.single; |
** 输出结果 **:
懒汉式(线程不安全)【不可用】
** 代码实现 **:
1 | package main.java.com.study.designPatterns.single; |
** 测试类 **:
1 | package main.java.com.study.designPatterns.single; |
** 输出结果 **:
懒汉式(线程安全,同步方法)【不推荐用】
** 代码实现 **:
1 | package main.java.com.study.designPatterns.single; |
** 测试类 **:
1 | package main.java.com.study.designPatterns.single; |
** 输出结果 **:
懒汉式(线程安全 , 同步代码块)【不可用】
** 代码实现 **:
1 | package main.java.com.study.designPatterns.single; |
** 测试类 **:
1 | package main.java.com.study.designPatterns.single; |
** 输出结果 **:
静态内部类【推荐用】
** 代码实现 **:
1 | package main.java.com.study.designPatterns.single; |
** 测试类 **:
1 | package main.java.com.study.designPatterns.single; |
** 输出结果 **:
双重检查【推荐用】
** 代码实现 **:
1 | package main.java.com.study.designPatterns.single; |
** 测试类 **:
1 | package main.java.com.study.designPatterns.single; |
** 输出结果 **:
枚举【推荐用】
** 代码实现 **:
1 | package main.java.com.study.designPatterns.single; |
** 测试类 **:
1 | package main.java.com.study.designPatterns.single; |
** 输出结果 **:
CAS【不推荐用】
1 | package com.springboot.whb.study.netty; |
Lock机制【推荐用】
1 | package com.springboot.whb.study.netty; |