什么单例模式?

单例模式是Java最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时保证只有单个对象被创建。这个类提供了一种访问其对象的唯一的方式(静态调用),可以直接调用,不需要实例化对象。

为什么要使用单例模式?

单例模式主要是为了避免创建多个实例而造成资源的浪费。它可以保证一个类的内存中对象的唯一性,在一些常用工具类、线程池、数据库、电脑打开任务管理器、控制面板等可能只允许我们创建一个对象,一方面如果创建多个对象可能引起程序错误,另一方面创建多个对象也会造成资源的浪费。

如何设计单例模式?

不允许其他程序new对象

在该类中创建对象

对外提供一个可以让其他程序获得该类对象的方法

以上主要都是为了保证对象的唯一性。那么如何转化成代码呢?

私有化该类的构造方法

在本类中new一个对象

定义一个共有方法,将本类中的新建对象返回

常用单例模式的实现方法:

1.饿汉模式

这种方法缺点就是classloader机制避免了多线程问题的同时,也让类加载的时候instance就已经实例化。不管后续需不需要实例化对象,都已经创建了对象,占用内存。

public class EagerSingle {

private static EagerSingle instance = new EagerSingle();

private EagerSingle() {}

public static EagerSingle getInstance() {

return instance;

}

}

通过测试类代码了解实例情况:

public class Test {

public static void main(String[] args) {

EagerSingle es1 = EagerSingle.getInstance();

System.out.println("es1: "+es1);

es1 = null;

System.out.println("es1: "+es1);

EagerSingle es2 = EagerSingle.getInstance();

System.out.println("es2: "+es2);

}

}

结果:

从输出结果很明显看到, 调用了两次getinstance()方法获得的是同一个对象的地址值。若对对象进行null赋值操作,也只是清除了其所存的地址的值,并不会对单例类的实例对象有任何影响。

2.懒汉模式

public class LazySingle {

private static LazySingle instance = null;

private LazySingle() {}

public static LazySingle getInstance() {

if(instance == null)

instance = new LazySingle();

return instance;

}

}

此时的懒汉模式并不支持多线程。若由多线程并行操作,因为对象的创建也需要一定的时间开销,上一个线程对象还未创建完成时地址值为null,下一个线程说不定也要创建对象。显然instance会指向最后创建的对象。

给方法加上同步锁synchronized就ok啦。

public static synchronized LazySingle getinstance(){}

3.双重校验锁 / 双检锁

加了同步锁以后会影响程序运行的效率,这里可以采用双锁机制,安全且在多线程的情况下保持高性能。

public class DoubleCheckedSingle {

private static DoubleCheckedSingle instance = null;

private DoubleCheckedSingle() {};

public static DoubleCheckedSingle getInstance() {

if(instance == null) {

synchronized (DoubleCheckedSingle.class) {

if(instance == null) {

instance = new DoubleCheckedSingle();

}

}

}

return instance;

}

}

4.静态内部类

同样利用了classloader机制保证初始化instance只有一个线程,和饿汉模式不同的是:饿汉模式只要类加载就会实例化对象,而这种方式的StaticSingle类即使被加载了也不一定产生实例化对象,因为静态内部类没有被调用,只有调用了StaticSingleHolder才会实例化instance对象。

也就是说,如果实例化instance很消耗资源,所以想要延迟加载,另一方面又不希望instance被加载时就实例化,而是需要时采取主动调用方法实例化,也是线程安全,这种静态内部类就很合适。

public class StaticSingle {

private static class StaticSingleHolder{

private static final StaticSingle instance = new StaticSingle();

}

private StaticSingle() {}

public static StaticSingle getInstance() {

return StaticSingleHolder.instance;

}

}

5.枚举

说实话,没太懂······

这种实现方法还没有被广泛应用,但这却是最佳实现单例模式的方法。它简洁,绝对防止多次实例化,避免了线程同步,还自动支持序列化机制。不过由于是JDK1.5以后加入的机制,很少用。

public enum Singleton {

INSTANCE;

public void whateverMethod() {

}

}

一般情况,不建议使用懒汉模式,推荐饿汉模式。有明确任务要求可以考虑其他。

找出单身狗java_Java单身狗 —— 单例模式相关推荐

  1. 算法题:“找出单身狗”--找出一个数组中只出现一次的数字

    题目:一个数组中只有两个数字是出现一次,其他所有数字都出现了两次. 编写一个函数找出这两个只出现一次的数字. 解题过程以及思路:(思路在代码中以注释形式给出) //一个数组中只有两个数字是出现一次,其 ...

  2. 找出单身狗_只出现一次的数字Ⅲ

    给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次. 找出只出现一次的那两个元素.你可以按 任意顺序 返回答案. 你的算法应该具有线性时间复杂度.你能否仅使用常数空间复杂 ...

  3. C语言—找出单身狗(2个)

    //找出数组中两个只出现一次的数,其它数都成对存在 #include<stdio.h> int main() {int arr[10] = { 5,7,6,1,2,6,7,2,3,1 }; ...

  4. 村子里有50个人,每人有一条狗,在这50条狗中有病狗(这种病不传染),于是人们要找出病狗。

    IBM公司向来以高素质人才作为企业持续竞争力的保证.进入IBM公司是差不多每个IT人的梦想.下面这条IBM公司的面试题,给大家试试看,看看是否具备进入IBM的实力! 村子里有50个人,每人有一条狗,在 ...

  5. “1000瓶药水,其中至多有1瓶剧毒,小狗服完药20小时后才能判断是否中毒。现在给你10只小狗、在24小时内、通过小狗试药的方式找出哪瓶药有毒或者全部无毒”

    题目: 1000瓶药水,其中至多有1瓶剧毒,小狗服完药20小时后才能判断是否中毒. 现在给你10只小狗.在24小时内.通过小狗试药的方式找出哪瓶药有毒或者全部无毒 思路: 一."小狗服完药2 ...

  6. 准确率99.9%!如何用深度学习最快找出放倒的那张X光胸片(代码+数据)

    医学图像数据的质量一直是个老大难题.难以清理的数据制约着许多深度学习的应用. 而实际上,深度学习本身就是清洗医疗数据的好帮手. 今天,我们就来讲一个案例,展示如何用深度学习迅速清洗一个杂乱的医疗图像数 ...

  7. sql找出2000-3000年中的闰年。_跟飞哥学编程:SQL入门-4-查询和条件

    为了教学方便,我们先引入一个关键字: SELECT 使用SELECT,可以查询得到表数据,比如: SELECT 其中,星号(*)代表所有列.运行上述SQL语句,返回的就是Student表的所有行所有列 ...

  8. IBM面试题 50条狗 有病狗 有几条病狗?

    题目:村子里有50个人,每人有一条狗,在这50条狗中有病狗(这种病不传染),于是人们要找出病狗. 每个人可以观察其他49条狗,以判断他们是否生病,(如果有病一定能看出来),只有自己的狗不能看,观察后得 ...

  9. 通过Stream流找出集合中对象中某个属性重复的值.

    在日常的开发中,经常会碰到对数据库查出来的数据还要进行二次的业务逻辑处理的情况,有时候需要对一个对象集合中的重复的元素进行剔除. 下面是一个demo. 可以找出对象List中,某个属性重复的值. pu ...

  10. 狗年说狗--忠诚的卫士

     狗年说狗--忠诚的卫士 作者: 梅兰                                             主页: http://http://free.ys168.com/?um ...

最新文章

  1. 英飞凌单片机TC264实战攻略
  2. git pull遇到错误
  3. Ubuntu16.04 Linux上比较好用的截图工具Flameshot
  4. 华为OJ 名字美丽度
  5. 04_Struts2标签
  6. linux配置chrony时间同步
  7. 阿里云资深技术专家李克畅谈边缘云计算趋势与实践
  8. Spring开发包介绍
  9. vue --- 使用中央事件总线(bus)实现跨组件通信
  10. 如何基于FFMPEG和SDL写一个少于1000行代码的视频播放器
  11. java enum 泛型,Java Enum作为Enum中的泛型类型
  12. 迷宫的最短路径(bfs)
  13. 五子棋人机对战_10.带人机对战的五子棋程序
  14. BIOS、BootLoader、uboot对比
  15. matlab生成chirp信号,chirp信号(chirp信号的产生)
  16. 图计算简介和Pregel简介
  17. java 群发邮件_java群发邮件
  18. Oracle触发器,删除一条数据的同时删除另一张表的关联数据
  19. 干货 | 关于SwiftUI,看这一篇就够了
  20. karabiner改键教程

热门文章

  1. 华为手机耳机sws音效是什么_耳机sws音效是什么 华为手机耳机sws音效是什么
  2. python 正则表达式匹配数字或者小数点_Python 正则表达式 匹配小数
  3. date类before()方法的主要作用是_过程(Sub)、函数(Function)、集合(Collection)作用范围...
  4. ubuntu 串口调试工具推荐_Qt开源作品3-串口调试助手
  5. 20. Django进阶:生成csv文件
  6. JavaWeb:XML
  7. Echarts数据动态加载的实现样例
  8. 深度学习笔记_评分函数/损失函数
  9. Android for opencv(1)android使用opencv基本操作:读写 图片,操作像素等
  10. c++中#pragma用法详解