第一种(饿汉式单例模式):在声明变量时实例化

public class Singleton {

     //静态初始化自动实例化
private static Singleton instance = new Singleton();
//无参数构造方法
private Singleton(){}
   public static Singleton getInstance() {   return instance;     } }

优点:在类加载初始化的时候就创建对象,调用getInstance的时候,没有同步方法,运行时性能较高。

缺点:类加载速度慢,占用太多大的资源空间。

第二种(懒汉式单例模式):把对象的创建放到方法里面去

public class Singleton { 
  private static Singleton instance = null;
  private Singleton(){}
  public static synchronized Singleton getInstance() {
  if (instance == null){
      instance = new Singleton();       }
return instance;
  }
}   

优点:避免了第一种方式的缺点, 同时,可以在多线程下运行安全。

缺点:因为他使用了锁,在运行中效率慢。

总结:

单例模式的作用:

保证一个类只有单一的实例,也就是说你无法通过new来创建这个类的一个新实例。

当一个对象在程序内部只能有一个实例的时候,它可以保证我们不会重复创建,而是始终指向同一个对象。

Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。

无参构造方法的作用是:

每一个类至少要有一个构造函数,如果你自己构建了一个带有参数的构造函数而没有再显示的写出无参的构造也是可以的,不过当你尝试通过一个无参的构造函数来构建(new的方式)时,此时编译器才会报错,因为找不到这个无参的构造函数。

也就是说当一个类你没有给他构造函数,则编译器会自动补上一个无参的,若有的话就不会,你需要显示将此无参的构造函数写出来

拓展一点:Spring集成Swagger 开发

原创直接参考:https://blog.csdn.net/BlackMambaProgrammer/article/details/72354007

Java中 单例(Singleton)的两种方式的更多相关文章

  1. iOS:创建单例对象的两种方式

    单例模式:创建单例对象的两种方式 方式一:iOS4版本之前      static SingleClassManager *singleManager = nil;      +(SingleClas ...

  2. Java中的ReentrantLock和synchronized两种锁定机制的对比

    问题:多个访问线程将需要写入到文件中的数据先保存到一个队列里面,然后由专门的 写出线程负责从队列中取出数据并写入到文件中. http://blog.csdn.net/top_code/article/ ...

  3. strus2中获取表单数据 两种方式 属性驱动 和模型驱动

    strus2中获取表单数据 两种方式 属性驱动 和模型驱动 属性驱动 /** * 当前请求的action在栈顶,ss是栈顶的元素,所以可以利用setValue方法赋值 * 如果一个属性在对象栈,在页面 ...

  4. [Android] Android ViewPager 中加载 Fragment的两种方式 方式(二)

    接上文: https://www.cnblogs.com/wukong1688/p/10693338.html Android ViewPager 中加载 Fragmenet的两种方式 方式(一) 二 ...

  5. [Android] Android ViewPager 中加载 Fragment的两种方式 方式(一)

    Android ViewPager 中加载 Fragmenet的两种方式 一.当fragment里面的内容较少时,直接 使用fragment xml布局文件填充 文件总数 布局文件:view_one. ...

  6. 怎样在Android开发中FPS游戏实现的两种方式比较

    怎样在Android开发中FPS游戏实现的两种方式比较 如何用Android平台开发FPS游戏,其实现过程有哪些方法,这些方法又有哪些不同的地方呢?首先让我们先了解下什么是FPS 英文名:FPS (F ...

  7. Eclipse中构建maven项目的两种方式

    Eclipse中构建maven项目的两种方式 方式一: 1.构建maven项目 1.1 新建meven项目,可在Other中找到maven文件夹 1.2 进入maven项目后,点击next 1.3 在 ...

  8. HTML中设置背景图的两种方式

    HTML中设置背景图的两种方式 1.background    background:url(images/search.png) no-repeat top; 2.background-image ...

  9. .Net 中读写Oracle数据库常用两种方式

    .net中连接Oracle 的两种方式:OracleClient,OleDb转载 2015年04月24日 00:00:24 10820.Net 中读写Oracle数据库常用两种方式:OracleCli ...

随机推荐

  1. 转:oracle驱动表

    以一个比较两本字典来做例子:       一本字典有索引目录(dict a), 一本没有(dict b)       现在要找出所有a开头的单词的异同       那么比较的时候,你会怎么比较?    ...

  2. 【scala】可变与不可变的理解

    我们定义变量的时候分为var可变变量和val不可变变量. 我们使用容器的时候也分为可变容器和不可变容器. List和Tuple本身就是不可变的,set和map分为可变和不可变的,默认为不可变. 我们看 ...

  3. Makefile的补充学习2

    Makefile中使用通配符(1)* 若干个任意字符(2)? 1个任意字符(3)[] 将[]中的字符依次去和外面的结合匹配 还有个%,也是通配符,表示任意多个字符,和*很相似,但是%一般只用于规则描述 ...

  4. window.location.href无法跳转

    onclick事件存在事件冒泡 所以要阻止它冒泡 解决:在onclick事件里添加return false阻止冒泡:onclick="window.location.href='XXXXX. ...

  5. 2017.11.16 STM8L052 温度控制器

    1 J-link和ST-link的兼容性 STM8只能用ST-link.J-link兼容所有的(大部分而已)的ARM内核IC mark:  http://bbs.eeworld.com.cn/thre ...

  6. 《深入理解java虚拟机》学习笔记之虚拟机即时编译详解

    郑重声明:本片博客是学习<深入理解java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块 ...

  7. Leetcode 1006. Clumsy Factorial

    class Solution(object): def clumsy(self, N): """ :type N: int :rtype: int "" ...

  8. canvas 绘制图像

    结果: 代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="U ...

  9. for-in和for 循环 的区别

    以前早就知道,for...in 语句用于对数组或者对象的属性进行循环操作,而for循环是对数组的元素进行循环,而不能引用于非数组对象, 但咱在js项目里,遇到循环,不管是数组还是对象,经常使用for- ...

  10. ResNet网络结构

    MSRA(微软亚洲研究院)何凯明团队的深度残差网络(Deep Residual Network)在2015年的ImageNet上取得冠军,该网络简称为ResNet(由算法Residual命名),层数达 ...