java基础10 单例模式之饿汉式和懒汉式单例
前言: 软件行业中有23中设计模式
单例模式
模版模式
装饰者模式
观察者模式
工厂模式
...........
单例模式
1. 单例模式包括
1.1 饿汉式单例
1.2 懒汉式单例
2. 概念
单例模式: 保证一个类中存在唯一的一个对象
模式: 模式就是解决某类问题的固定步骤
3. 单例模式步骤
1.私有化构造器
2.声明本类中的引用类型变量,并且使该变量指向本类对象
3.提供一个公共的静态的方法获取该类的对象
4. 饿汉式单例(步骤)
1.私有化构造器
2.声明本类中引用类型变量,并且使该变量指向本类对象
3.提供一个公共的静态方法获取本类中的对象
5. 懒汉式单例(步骤)
1.私有化构造器
2.声明本类中引用类型变量
3.提供一个公共的静态方法获取本类中的对象,获取之前先判断是否已经创建本类中的对象,如果创建了,那么直接返回对象即可,如果没有创建,先创建本类中的对象,然后在返回.
6.数据类型
数据类型包括: 1. 基本数据类型;2. 引用数据类型
6.1 基本数据类型:除了基本数据类型(四类八种),其他的都是引用类型.
6.2 引用类型:数组、类、接口、抽象(类)等等。

7. 举例
//饿汉式单例 //线程安全的
class Single{
private String name;
//声明本类的引用类型变量,并且该变量指向本类对象
private static Single sing = new Single(); public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
//私有化构造器
private Single(){ }
//提供一个公共的静态方法,用于获取本类中的对象
public static Single getInstance(){
return sing;
}
} //懒汉式单例 //线程不安全. 需要双重判断+使用同步方法,线程才安全.
class Single2{
private String name;
//声明本类的引用类型变量
private static Single2 single; public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
//私有化构造器
private Single2(){ }
//提供一个公共的静态方法,用于获取本类中的对象
public static Single2 getInstance(){//synchronized(): 同步方法. 由于懒汉式单例线程不安全,所以才要使用同步方法和双重判断,才能保证线程安全
if(single == null){//可能同时存在多个线程进来(假如s2和s3同时进来)
/*第一个线程进来后,该方法被锁定,等第一个线程处理完并出来后(此时single有值了,所以第三个以后的进程不会走这步了),第二个进程才能进来.
*由于上一步是两个进程同时进来的,所以还会继续往下执行,进入同步方法.但是,由于上面进来的是两个不同的进程,那么会改变single的值,出现线程不安全的情况,所以同步方法中还要加一步判断
*/
//synchronized(class):如果不同线程监视同一个实例或者不同的实例对象,都会等待.
synchronized(Single2.class){//Single2.class:监视器,监视Single2这个对象[指Single2 single = new Single2()].
if(single == null){//此步,第二个进程不会再进来了,因为第一个进程进来后single已经有相对应的值,不再是NULL. 双重判断保证线程的安全
single = new Single2();
}
}
}
return single;
}
} class Demo7 {
public static void main(String[] args) {
//测试饿汉式单例
Single s = Single.getInstance();
Single s1 = Single.getInstance();
s.setName("狗娃");
s1.setName("狗剩");
System.out.println(s.getName());
System.out.println(s1.getName()); //下面是测试懒汉式单例
Single2 s2 = Single2.getInstance();
Single2 s3 = Single2.getInstance();
s2.setName("张三");
s3.setName("李四");
System.out.println(s2.getName()+"==========");
System.out.println(s3.getName()+"==========");
}
}
结果图:

说明: 单例模式,保证一个类中只存在唯一的一个对象
8. 同步方法中的 "监视器"
synchronized(this) 与 synchronized(class) 相关知识: https://www.cnblogs.com/highriver/archive/2011/12/18/2291965.html
|
原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:http://www.cnblogs.com/dshore123/p/8794288.html 欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!) |
java基础10 单例模式之饿汉式和懒汉式单例的更多相关文章
- java单例模式(饿汉式和懒汉式)
1 /* 2 * 设计模式:对问题行之有效的解决方式.其实它是一种思想. 3 * 4 * 1,单例设计模式 5 * 解决的问题:就是可以保证一个类在内容中的对象唯一性. 6 * 7 * 必须对于多个程 ...
- Java中单例设计模式,饿汉式和懒汉式
Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯 ...
- Java 单例设计模式之 饿汉式和懒汉式
public class InstanceSampleTest { public static void main(String[] args) { /** 单例设计模式的 饿汉式和懒汉式 * 单例模 ...
- Java面试 - 什么是单例设计模式,为什么要使用单例设计模式,如何实现单例设计模式(饿汉式和懒汉式)?
什么是单例设计模式? 单例设计模式就是一种控制实例化对象个数的设计模式. 为什么要使用单例设计模式? 使用单例设计模式可以节省内存空间,提高性能.因为很多情况下,有些类是不需要重复产生对象的. 如果重 ...
- Java中如果把构造方法也私有化,如何创建对象?Java的单例设计模式——饿汉式和懒汉式区别
Java的单例模式——饿汉式 package com.swift; //Java单例设计模式——恶汉式 public class SinglePerson { private String name= ...
- 设计模式:单例模式介绍及8种写法(饿汉式、懒汉式、Double-Check、静态内部类、枚举)
一.饿汉式(静态常量) 这种饿汉式的单例模式构造的步骤如下: 构造器私有化:(防止用new来得到对象实例) 类的内部创建对象:(因为1,所以2) 向外暴露一个静态的公共方法:(getInstance) ...
- Singleton模式(单例模式) 饿汉式和懒汉式
目的:整个应用中有且只有一个实例,所有指向该类型实例的引用都指向这个实例. 好比一个国家就只有一个皇帝(XXX),此时每个人叫的“皇帝”都是指叫的XXX本人; 常见单例模式类型: 饿汉式单例:直接将对 ...
- C#单例---饿汉式和懒汉式
单例模式: 步骤: 1.定义静态私有对象 2.构造函数私有化 3.定义一个静态的,返回值为该类型的方法,一般以Getinstance/getInit为方法名称 单例模式有懒汉和饿汉,最好使用饿汉 1. ...
- Java---15---单例设计模式:---饿汉式和懒汉式
概念: 单例模式确保某个类仅仅有一个实例.并且自行实例化并向整个系统提供这个实例. 单例模式有下面特点: 1.单例类仅仅能有一个实例 2.单例类必须自己给自己创建自己的唯一实例 3.单例类必须给全 ...
随机推荐
- 【刷题】BZOJ 4025 二分图
Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考考你. Input ...
- Netsh命令-修改网络IP设置
原文链接地址:https://blog.csdn.net/qq_38054198/article/details/77990914 静态设置IP 修改IP地址addr和子网掩码mask: \>n ...
- 51nod 1623 完美消除(数位DP)
首先考虑一下给一个数如何求它需要多少次操作. 显然用一个单调栈就可以完成:塞入栈中,将比它大的所有数都弹出,如果栈中没有当前数,答案+1. 因为数的范围只有0~9,所以我们可以用一个二进制数来模拟这个 ...
- Python new() 方法
什么是new方法 __new__方法接受的参数虽然也是和__init__一样,但__init__是在类实例创建之后调用,而 __new__方法正是创建这个类实例的方法. __new__()是在新式类中 ...
- 使用 openssl 生成证书(转)
一.openssl 简介 openssl 是目前最流行的 SSL 密码库工具,其提供了一个通用.健壮.功能完备的工具套件,用以支持SSL/TLS 协议的实现.官网:https://www.openss ...
- 「Python」python绘制图表
介绍一种简单而又功能强大的绘制图形或报表的包—pyecharts,一个基于Echarts(基于JS的数据可视化库)的图标类库,除了绘制常见的折线图.柱状图.饼图.箱型图和散点图外,还可以绘制3D柱状图 ...
- PlantUML —— 应用于 Eclipse 的简单快速的 UML 编辑软件
PlantUML —— 应用于 Eclipse 的简单快速的 UML 编辑软件 简介: 在应用系统软件开发过程中,如果软件由很多对象组成,它的结构仅仅凭借分析很难理清,同时为了有利于软件的开发及重用, ...
- 使用 JSONDoc 记录 Spring Boot RESTful API
这个博文可以分为两部分:第一部分我将编写一个Spring Boot RESTful API,第二部分将介绍如何使用JSONDoc来记录创建的API.做这两个部分最多需要15分钟,因为使用Spring ...
- Android Studio Gradle's dependency cache may be corrupt Re-download dependencies and sync project (requires network)
转:Android studio 快速解决Gradle's dependency cache may be corrupt 和 Gradle配置 gradle-3.*-all.zip快速下载 Andr ...
- fastreport中文乱码问题
fastreport的中文乱码问题,确实让人头疼,我使用的是delphi6+fastrepport4.7,在4.7版本中,主要表现在以下几种情况. 预览不乱码,保存乱码. 简体不乱码,繁体乱码. 简体 ...