java单例模式使用及注意事项

 更新时间:2014年04月15日 09:18:11   作者:  
这篇文章主要介绍了java单例模式使用及注意事项,需要的朋友可以参考下

1. 说明

1)单例模式:确保一个类只有一个实例,自行实例化并向系统提供这个实例

2)单例模式分类:饿单例模式(类加载时实例化一个对象给自己的引用),懒单例模式(调用取得实例的方法如getInstance时才会实例化对象)(java中饿单例模式性能优于懒单例模式,c++中一般使用懒单例模式)

3)单例模式要素:

a)私有构造方法
b)私有静态引用指向自己实例
c)以自己实例为返回值的公有静态方法

 2.实例

饿单例模式:

复制代码 代码如下:

package com.wish.modedesign;

public class HungrySingleton {
    private static HungrySingleton instance  = new HungrySingleton();
    private HungrySingleton(){
    }
    public static HungrySingleton getInstance(){
        return instance;
    }
}

懒单例模式:

复制代码 代码如下:

package com.wish.modedesign;

public class Singleton {
    private Singleton(){

    }
    private static Singleton instance;
    public static synchronized Singleton getInstance(){   //多线程时注意线程安全
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}

测试类Driver.java

复制代码 代码如下:

package com.wish.modedesign;

public class Driver {
    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s1==s2);   //true
    }

}

3.优点和适用场景

1)单例模式的优点:

在内存中只有一个对象,节省内存空间。
避免频繁的创建销毁对象,可以提高性能。
避免对共享资源的多重占用。
可以全局访问。
2)适用场景:

需要频繁实例化然后销毁的对象。
创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
有状态的工具类对象。
频繁访问数据库或文件的对象。
4.使用时注意事项

1)使用时不能用反射模式创建单例,否则会实例化一个新的对象

2)使用懒单例模式时注意线程安全问题

3)饿单例模式和懒单例模式构造方法都是私有的,因而是不能被继承的,有些单例模式可以被继承(如登记式模式)

相关文章

  • Java 实现并发的几种方式小结

    Java 实现并发的几种方式小结

    这篇文章主要介绍了Java 实现并发的几种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Spring Boot集成Thymeleaf模板引擎的完整步骤

    Spring Boot集成Thymeleaf模板引擎的完整步骤

    这篇文章主要给大家介绍了关于Spring Boot集成Thymeleaf模板引擎的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • mybatis返回结果为Map问题

    mybatis返回结果为Map问题

    这篇文章主要介绍了mybatis返回结果为Map问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Java 反射修改类的常量值、静态变量值、属性值实例详解

    Java 反射修改类的常量值、静态变量值、属性值实例详解

    在本篇文章里小编给大家整理的是一篇关于Java 反射修改类的常量值、静态变量值、属性值实例详解内容,有兴趣的读者们可以跟着学习下。
    2021-01-01
  • Java Stream API 使代码更出色的操作完全攻略

    Java Stream API 使代码更出色的操作完全攻略

    这篇文章主要介绍了Java Stream API 使代码更出色的操作完全攻略,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 简单了解java获取类的3种方式

    简单了解java获取类的3种方式

    这篇文章主要介绍了java获取类的3种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java中的Pair详细

    Java中的Pair详细

    这篇文章主要介绍Java中的很有意思的Pair,下面文章会以Pair用法展开,感兴趣的小伙伴可以参考下面文章的具体内容
    2021-10-10
  • SpringBoot集成Druid连接池连接MySQL8.0.11

    SpringBoot集成Druid连接池连接MySQL8.0.11

    这篇博客简单介绍spring boot集成druid连接池的简单配置和注意事项,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程详解

    es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程详解

    这篇文章主要介绍了es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 不规范使用ThreadLocal导致bug分析解决

    不规范使用ThreadLocal导致bug分析解决

    这篇文章主要为大家介绍了不规范使用ThreadLocal导致bug分析解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01

最新评论