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.单例类必须给全 ...
随机推荐
- TCP(Transmission Control Protocol)学习笔记
一.TCP(Transmission Control Protocol)原理介绍(参考维基百科) TCP连接包括三种状态:连接建立.数据传送和连接终止. TCP用三路握手(three-way hand ...
- 【刷题】BZOJ 3238 [Ahoi2013]差异
Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Output 54 HINT 2<=N< ...
- [BJWC2018]Border 的四种求法
description luogu 给一个小写字母字符串\(S\),\(q\)次询问每次给出\(l,r\),求\(s[l..r]\)的\(Border\). solution 我们考虑转化题面:给定\ ...
- [AT2064] [agc005_f] Many Easy Problems
题目链接 AtCoder:https://agc005.contest.atcoder.jp/tasks/agc005_f 洛谷:https://www.luogu.org/problemnew/sh ...
- 【EF】EntityFramework DBFirst的使用
一.前言 久闻EF大名,之前做C/S产品用的是Dapper对SqlLite进行ORM.然后接触公司授权系统后发现用的是EntityFramework对SQLSever进行ORM.授权系统 ...
- 自动化测试常用断言的使用方法(python)
自动化测试中寻找元素并进行操作,如果在元素好找的情况下,相信大家都可以较熟练地编写用例脚本了,但光进行操作可能还不够,有时候也需要对预期结果进行判断. 这里介绍几个常用断言的使用方法,可以一定程度上帮 ...
- 解决电脑各种 dll 文件丢失问题
https://jingyan.baidu.com/article/ae97a646f9dbfdbbfc461d6d.html 下载鲁大师,点右上角的 游戏库,然后再点右上角的 修复 ,一键修复即 ...
- 洛谷P2563 [AHOI2001]质数和分解
题目描述 任何大于 1 的自然数 n 都可以写成若干个大于等于 2 且小于等于 n 的质数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形式.例如,9 的质数和表达式就有 ...
- docker操作mysql
Docker操作mysql 查找docker hub上的mysql镜像 Docker search.mysql 拉取官方的镜像标签为5.6 Docker pull mysql:5.6 在本地镜像列表里 ...
- LightOJ 1096 - nth Term 矩阵快速幂
http://www.lightoj.com/volume_showproblem.php?problem=1096 题意:\(f(n) = a * f(n-1) + b * f(n-3) + c, ...