很多人都疑惑,单例模式是什么?为什么要用单例模式?在这里,笔者记录的仅仅只是自己对于知识点的理解,如果有错误的,请下方评论指教,共同进步,谢谢。

单例模式是什么?

简单理解: 单例就是一个实例被多个用户共享,好比宿舍共用同一个垃圾桶,这个垃圾桶就是单个实例,现实生活中不可能每个人都配一个垃圾桶什么的,那样太浪费资源了吧。

官方理解:对象的创建模式,确保某一个类只有一个实例,并且能够自动实例化且向整个应用程序提供这个实例。单例模式的核心在于通过一个接口返回唯一的对象实例;首要的问题就是要把创建实例的权限收回来,让类自身来负责自己类的实例的创建工作,然后由这个类来提供外部可以访问这个类实例的方法

单例模式的特点:

1、单例类只能有一个实例

2、单例类必须自己创建自己的实例(无法从外部创建,创建的时候将构造函数设置为私有的)

3、单例类必须向所有对象提供自己的实例

单例模式的优点:

1、在内存中只有一个对象,节省内存空间

2、避免频繁的创建销毁对象,提高性能

3、避免对共享资源的占用,可以全局访问

单例模式的类型:

1、饿汉单例(自动创建实例)

2、懒汉单例(调用的时候才创建实例)

3、登记式单例(这个我还没理解)

一、饿汉单例

//饿汉式单例,在类初始化的时候,已经自己实例化了
public class mvc {
private static mvc instance = new mvc();
private mvc() {
}
public static mvc getInstance(){
return instance;
}
}

饿汉在类创建的同时就已经创建好一个静态的对象供使用了,线程是安全的

二、懒汉单例

//懒汉单例,在第一次调用的时候实例化自己
public class mvc1 {
private static mvc1 instance = null;
private String name;
private mvc1(){}
//静态工厂方法
synchronized public static mvc1 getInstance(){
if(instance==null){
instance = new mvc1();
}
return instance;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void printinfo(){
System.out.println("this name is "+name);
}
}

测试代码
//定义测试类
public class testmvc1 {
public static void main(String[] args) {
mvc1 m2 = mvc1.getInstance();
m2.setName("0539");
mvc1 m1 = mvc1.getInstance();
m1.setName("json");
m1.printinfo();
m2.printinfo();
System.out.println(m1==m2?"创建的是同一个实例":"创建的不是同一个实例");
}
}

结果

this name is json
this name is json
创建的是同一个实例
测试结果说明:实例化,结果往往是最后一个的实例。也就是说,单例模式,不管是饿汉还是懒汉,创建的都是同一个实例。
mvc1类必须要有一个 private 访问级别的构造函数,只有这样,才能确保单例不会在系统中的其他代码内被实例化,同时,在外部的话只能通过getInstance()方法去调用;
其次,instance 成员变量和 getInstance 方法必须是 static 的。
懒汉单例下是没有考虑线程安全问题的,所以要用synchronized加同步

饿汉和懒汉的区别:
1、饿汉自动实例化,懒汉要调用它才实例化
2、饿汉不用考虑线程安全问题,懒汉需要考虑线程安全问题

什么是线程安全?

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

或者说:一个类或者程序所提供的接口对于线程来说是原子操作,或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题,那就是线程安全的。

总结:

1、单例模式的作用是用来创建单个实例,并且这个实例这整个应用程序共享

2、单例模式的类型有三种:饿汉单例,懒汉单例,登记式单例

  其中饿汉自动创建实例,并保证线程安全;懒汉被动创建实例,不能保证线程安全的问题。

3、单例模式的优点:但同一个对象被多次实例,会占用大量资源,减少性能;通过采用单例,那么每次都是调用同一个实例,会提高性能。好比喝水,不可能每次都用一次性杯子。

Java设计模式之单例模式的更多相关文章

  1. java 设计模式之单例模式

    -------Success is getting what you want, happiness is wanting what you get. java设计模式之单例模式(Singleton) ...

  2. 折腾Java设计模式之单例模式

    博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access ...

  3. Java设计模式之单例模式(七种写法)

    Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ...

  4. Java 设计模式之单例模式(一)

    原文地址:Java 设计模式之单例模式(一) 博客地址:http://www.extlight.com 一.背景 没有太多原由,纯粹是记录和总结自己从业以来经历和学习的点点滴滴. 本篇内容为 Java ...

  5. java设计模式1——单例模式

    java设计模式1--单例模式 1.单例模式介绍 1.1.核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 1.2.常见场景 1.3.单例模式的优点 1.4.常见的五种单例模式实现 ...

  6. java设计模式之单例模式你真的会了吗?(懒汉式篇)

    java设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...

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

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

  8. java设计模式- (1)单例模式

    参加校园招聘的笔试,发现公司都会考一些java设计模式,所以上网查询相关内容,总结常用的几种单例模式. 单例模式(Singleton Pattern)是 Java中最简单的设计模式之一.这种类型的设计 ...

  9. [转]JAVA设计模式之单例模式

    原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...

  10. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

随机推荐

  1. Java,extends,继承

    1. 继承的概念: 继承在本职上是特殊--一般的关系.子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法. 2. 继承中的初始化顺序: 从类的结构上而言,其内部可以有如下四种 ...

  2. 2013 duilib入门简明教程 -- 界面设计器 DuiDesigner (10)

        上一个教程讲解了怎么布局最大化.最小化.关闭按钮,但是如果手动去计算这三个按钮的位置和大小的话,非常的不直观,也很不方便.     所以这一章准备介绍duilib的UI设计器,由于这个设计器很 ...

  3. Android笔记——关于Cursor类的介绍

    使用过 SQLite数据库的童鞋对 Cursor 应该不陌生,加深自己和大家对Android 中使用 Cursor 的理解. 关于 Cursor 在你理解和使用 Android Cursor 的时候你 ...

  4. bootstrap-modal 学习笔记 源码分析

    Bootstrap是Twitter推出的一个开源的用于前端开发的工具包,怎么用直接官网 http://twitter.github.io/bootstrap/ 我博客的定位就是把这些年看过的源码给慢慢 ...

  5. OpenCASCADE Quaternion

    OpenCASCADE Quaternion eryar@163.com Abstract. The quaternions are members of a noncommutative divis ...

  6. Inno Steup 打包加入文件夹

    在[Files]段下,添加下面代码Source: "执行文件.exe"; DestDir: "{app}"; Flags: igNoreversionSourc ...

  7. 简单生成svg文件

    this.fileSaveSync = function (file, data) { var fs = require('fs-extra'); fs.writeFileSync(file, dat ...

  8. 深入理解DOM节点类型第七篇——文档节点DOCUMENT

    × 目录 [1]特征 [2]快捷访问 [3]文档写入 前面的话 文档节点document,隶属于表示浏览器的window对象,它表示网页页面,又被称为根节点.本文将详细介绍文档节点document的内 ...

  9. JSP生成Excel报表

    JSP实现报表下载 <%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib uri=" ...

  10. ONE

    我是漆黑夜空中 闪烁凄凄的一颗星 遥隔千里的双眸一遇 看到了,你那藏在泪光里的话 你一个人 把泪擦干 把话捏在手心 陪着我,承受着黑夜的孤独 说明:来自落网的一个期刊<ONE>. 听这个期 ...