总结下Java单例模式的几种写法:

1. 饿汉式

  1. public class Singleton
  2. {
  3.  
  4. private static Singleton instance = new Singleton();
  5.  
  6. private Singleton() {}
  7.  
  8. public static Singleton getInstance() {
  9. return instance;
  10. }
  11.  
  12. }

优点:实现简单,不存在多线程问题,直接声明一个私有对象,然后对外提供一个获取对象的方法。

缺点:class 类在被加载的时候创建Singleton实例,如果对象创建后一直没有使用,则会浪费很大的内存空间,此方法不适合创建大对象。

2. 懒汉式(线程不安全)

  1. public class Singleton
  2. {
  3.  
  4. private static Singleton instance = null;
  5.  
  6. private Singleton() {}
  7.  
  8. public static Singleton getInstance() {
  9.  
  10. if (instance == null) {
  11. instance = new Singleton();
  12. }
  13. return instance;
  14. }
  15.  
  16. }

优点:节省内存空间,在使用的时候才会创建;

缺点:在多线程下,可能会创建多个实例(一定要重视这个问题,有时候如果在单例对象的构造方法中做了某些重要操作,创建多个实例可能会造成可怕后果,如:打开Android的Sqlite数据库连接)。

3. 懒汉式(线程安全)

  1. public class Singleton
  2. {
  3.  
  4. private static Singleton instance = null;
  5.  
  6. private Singleton() {}
  7.  
  8. public synchronized static Singleton getInstance() {
  9.  
  10. if (instance == null) {
  11. instance = new Singleton();
  12. }
  13. return instance;
  14. }
  15.  
  16. }

优点:支持多线程,且以懒汉式的方式加载,不浪费内存空间。

缺点:将 synchronized 块加在方法上,会影响并发量,每次调用getInstance()方法都会线程同步,效率十分低下。最重要的是,当创建好实例对象之后,就不必继续进行同步了。

4.懒汉式(线程安全,推荐)

  1. public class Singleton
  2. {
  3.  
  4. private static volatile Singleton instance = null;
  5.  
  6. private Singleton() {}
  7.  
  8. public static Singleton getInstance() {
  9. if (instance == null) {
  10. synchronized (Singleton.class) {
  11. if (instance == null) {
  12. instance = new Singleton();
  13. }
  14. }
  15. }
  16. return instance;
  17. }
  18.  
  19. }

优点:支持多线程,并发量高,且以懒汉式加载,不浪费内存空间。

缺点:一时找不出缺点,非要说缺点的话,就是实现比较麻烦。

单例模式:Java单例模式的几种写法及它们的优缺点的更多相关文章

  1. java多线程的3种写法

    1.Thread /** * */ package testJava2.thread; /** * @author xxx.sjtu * @function * @date 2017年5月17日 * ...

  2. Java中单例七种写法(懒汉、恶汉、静态内部类、双重检验锁、枚举)

    /*** * 懒汉模式 1 * 可以延迟加载,但线程不安全. * @author admin * */ public class TestSinleton1 { private static Test ...

  3. java enum的一种写法记录

    public enum TestEnum { provider { @Override public void provide() { this.name = "hjzgg"; } ...

  4. 9种Java单例模式详解(推荐)

    单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象.  懒汉式(线程不安全) 其主要表现在单例类在外 ...

  5. java设计模式之单例模式(几种写法及比较)

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  6. java单例模式的几种写法比较

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  7. Java:单例模式的七种写法(转载)

    第一种(懒汉,线程不安全): package Singleton; /** * @echo 2013-10-10 懒汉 线程不安全 */ public class Singleton1 { priva ...

  8. Java:单例模式的七种写法[转]

    第一种(懒汉,线程不安全):  1 public class Singleton {   2     private static Singleton instance;   3     privat ...

  9. 【JAVA学习】单例模式的七种写法

    尊重版权:http://cantellow.iteye.com/blog/838473 第一种(懒汉.线程不安全): Java代码   public class Singleton { private ...

随机推荐

  1. java加密算法-MD5

    import java.security.MessageDigest; public class MD5Util { /*** * MD5加密 生成32位md5码 * @param 待加密字符串 * ...

  2. spark HMM

    Scala实现的: https://github.com/skrusche63/spark-intent/tree/master/src/main/scala/de/kp/scala/hmm http ...

  3. LGOJP1941 飞扬的小鸟

    题目链接 题目链接 题解 \(f[i][j]\)表示位置\((i,j)\)到达需要的最小点击数. \(f[i][j]=\min\{{f[i-1][j-kx]+k},f[i-1][j+y]\}\) \( ...

  4. keepalived 的 vrrp_script

    [root@centos01 keepalived]# cat check_httpd.sh 脚本需要有执行权限 通常情况下,利用keepalived做热备,其中一台设置为master,一台设置为ba ...

  5. [俺们学校的题]伪.GCD

    GCD 题面: 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 思路: 首先两个数gcd(x,y)=p为质数,那么令x=k1*p,y=k2*p,由于是最 ...

  6. redis堵死致数据清空

    情景: zy的链路监控突然都恢复,而且在哪个时间段zabbix中显示回复,也发送了告警,但是实际上告警并没有发出来.这是不可能的情况,应该是redis缓存中的数据都被清空了,没有认为干预,需解决问题 ...

  7. Linux 文件系统引起的云盘文件系统异常导致 MySQL 数据页损坏事故恢复复盘

    事故的起因是因为当我访问某个数据库的某个表的时候,MySQL 立即出现崩溃并且去查看 MySQL 的错误日志出现类似信息 --09T05::.232564Z [ERROR] InnoDB: Space ...

  8. gdb tui设置默认窗口高度

    gdb -p 12999 -tui 先显示win信息(输入:info win) 显示如下: SRC (35 lines) <has focus> CMD (17 lines) 我们要改的是 ...

  9. BAT 删除超过xx天的文件

    @echo offecho 删除n天前的备分文件和日志forfiles /p "C:\ShareF" /m *.zip /d -7 /c "cmd /c del @pat ...

  10. Android Studio—增删改查—登录功能

    SQLite数据库的常用操作: create table if not exists 表名(字段1 类型(长度),字段2 类型(长度),...)//       建表 drop table if ex ...