设计模式系列-----------单例模式
来源:互联网 发布:红警3起义时刻知乎 编辑:程序博客网 时间:2024/05/21 07:49
http://cmsblogs.com/?cat=15
单例模式:确保一个类只有一个实例,并提供一个全局访问点。
什么情况下需要单例模式?
一些类提供公共功能供别人调用,本身不会处理业务逻辑类会被许多类和线程调用
单例模式的一些注意点:
单例的生存期超长,会导致内存的持续占用。
单例在多线程环境需要小心的处理线程互斥,进行资源保护。
单例在类的继承树中不利于使用,会破坏继承体系。
单例的全局可见性带来的设计破坏。
经典代码示例以及改进:
- public class Singleton {
- private static Singleton uniqueInstance ;
- public static Singleton getInstance() {
- if (uniqueInstance == null){
- uniqueInstance = new Singleton();
- }
- return uniqueInstance;
- }
- private Singleton() {
- }
- }
把getInstance()方法变成同步(synchronized)方法:
- public class Singleton {
- private static Singleton uniqueInstance ;
- public static synchronized Singleton getInstance() {
- if (uniqueInstance == null){
- uniqueInstance = new Singleton();
- }
- return uniqueInstance;
- }
- private Singleton() {
- }
- }
综合考虑有以下几种解决方案:
1、如果getInstance()的性能对程序不是很关键,那就不用考虑太多。
2、不用延迟实例化的方法。
- public class Singleton {
- private static Singleton uniqueInstance = new Singleton();//在静态初始化器中创建单例,这段代码保证了线程安全
- public static Singleton getInstance() {
- return uniqueInstance;
- }
- private Singleton() {
- }
- }
- public class Singleton {
- private volatile static Singleton uniqueInstance ;
- public static Singleton getInstance() {
- if (uniqueInstance == null){//A
- synchronized (Singleton.class){
- if (uniqueInstance == null){//C
- uniqueInstance = new Singleton();//B
- }
- }
- }
- return uniqueInstance;
- }
- private Singleton() {
- }
- }
其实这个意义在于防止多个线程同时进入第一个if内,比如说线程A执行到A行,线程B执行到B行,线程B还没有返回。当线程A执行到C行,这时线程B初始化实例完毕,如果没有里面的再一次判断就会生成两个实例!
其他需要注意点事项:
1、单例模式和静态类(把所有的方法和变量都定义成静态的)的区别
2、如果程序中存在多个类加载器,则不同的类加载器有可能加载同一个类,这种情况下就会出现多个单例类实例并存。这种情况下则需要自行指定类加载器,并指定同一个类加载器。 0 0
- 设计模式系列之单例模式
- 设计模式系列3-单例模式
- JAVA系列-设计模式-单例模式
- Android设计模式系列-单例模式
- Android设计模式系列-单例模式
- 炒冷饭系列:设计模式 单例模式
- Android设计模式系列-单例模式
- Android设计模式系列-单例模式
- 设计模式系列之 单例模式
- 设计模式系列-----------单例模式
- Android设计模式系列-单例模式
- Android设计模式系列-单例模式
- Android设计模式系列-单例模式
- java设计模式系列--单例模式
- Android设计模式系列-单例模式
- 单例模式----设计模式系列
- 设计模式系列一:单例模式
- 设计模式系列:单例模式
- scrollTop 用法讲解
- matlab画图
- PHP ORM思想学习
- 使用Notepad++的工程管理视图
- 数据结构之最小生成时Prim算法 java
- 设计模式系列-----------单例模式
- 构建自己的Ngrok服务器
- 42. 添加 Expires 头(3)
- 转载:STM32中的几个时钟SysTick、FCLK、SYSCLK、HCLK
- 小纯站长之家论坛 商业版(GBK)带4DIY带安装文档DOC带5配套插件
- 55. Jump Game
- 运行java程序的时候出现Exception in thread "main" java.lang.UnsupportedClassVersionError:
- TensorFlow 安装教程
- Haskell作业1(1)|实现分数的常用运算(2)|计算平方根的Newton-Raphson公式