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.单例类必须给全 ...
随机推荐
- [BJWC2018]Border 的四种求法
description luogu 给一个小写字母字符串\(S\),\(q\)次询问每次给出\(l,r\),求\(s[l..r]\)的\(Border\). solution 我们考虑转化题面:给定\ ...
- elasticsearch 第四篇(API约定)
对多个indices进行操作 es中大多resetapi支持请求多个index, 例如”test1,test2,test3”,index也可以使用通配符, 例如”test*“, 还可以使用+,-来包含 ...
- BZOJ2277 [Poi2011]Strongbox 【数论】
题目链接 BZOJ2277 题解 orz太难了 如果一个数\(x\)是密码,那么所有\((x,n)\)的倍数都是密码 如果两个数\(x,y\)是密码,那么所有\((x,y)\)的倍数都是密码 那么如果 ...
- 20135239益西拉姆 Linux内核分析 汇编一个简单的c程序并分析其指令过程
益西拉姆+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第一周linux内核分析 学习笔记 一.计算机 ...
- 那些你不常用却非常有用的MySql语句和命令
操作数据库 关于数据库的操作比较少,主要是:看.建.用.删. 查看数据库 获取服务器上的数据库列表通常很有用.执行show databases;命令就可以搞定. 1 mysql> show da ...
- python之numpy矩阵库的使用(续)
本文是对我原先写的python常用序列list.tuples及矩阵库numpy的使用中的numpy矩阵库的使用的补充.结合我个人现在对线性代数的复习进度来不断更博. Section 1:行列式的计算 ...
- git查看/修改 用户名和邮箱
用户名和邮箱地址的作用 用户名和邮箱地址是本地git客户端的一个变量,不随git库而改变. 每次commit都会用用户名和邮箱纪录. github的contributions统计就是按邮箱来统计的. ...
- Unix处理目标文件的工具
- CF832 D LCA倍增 裸
有询问$a,b,c$,求a到c路径上,同时是a到b路径的点的个数.其中询问中的a,b,c可任意选择作为起点或终点,求一组询问中最大值. LCA用于计算树上点对间距离,对于一组询问求深度最大的点作为起点 ...
- DHTML中window的使用
window对象是对浏览器窗口进行操作的对象.以下列出一些常用的对象(三级为对象的方法.属性) |-navigator:是对浏览器信息进行操作的对象 |-history:包含用户浏览过的url信息 | ...