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.单例类必须给全 ...
随机推荐
- 【比赛】HNOI2018 毒瘤
虚树+dp 直接看zlttttt的强大题解 zlttttt的题解看这里 #include<bits/stdc++.h> #define ui unsigned int #define ll ...
- 【Luogu3676】小清新数据结构题(动态点分治)
[Luogu3676]小清新数据结构题(动态点分治) 题面 洛谷 题解 先扯远点,这题我第一次看的时候觉得是一个树链剖分+线段树维护. 做法大概是这样: 我们先以任意一个点为根,把当前点看成是一棵有根 ...
- 【BZOJ3667】Rabin-Miller算法(Pollard_rho)
[BZOJ3667]Rabin-Miller算法(Pollard_rho) 题面 呜,权限题,别问我是怎么做的(我肯定没有权限号啊) 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一 ...
- splay tree 学习笔记
首先感谢litble的精彩讲解,原文博客: litble的小天地 在学完二叉平衡树后,发现这是只是一个不稳定的垃圾玩意,真正实用的应有Treap.AVL.Splay这样的查找树.于是最近刚学了学了点S ...
- windows 10上利用Microsoft RTF文件(CVE-2017-0199)进行攻击
Microsoft Word下的恶意RTF文件容易被收到攻击,在本文中,我们使用python脚本对Microsoft Word 2013进行oday攻击演示,该脚本会生成恶意的.rtf文件,并提供目标 ...
- Linux内核分析4
周子轩原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 使用库函数API和C代码 ...
- 洛谷10月月赛R2·浴谷八连测R3题解
早上打一半就回家了... T1傻逼题不说了...而且我的写法比题解要傻逼很多T T T2可以发现,我们强制最大值所在的块是以左上为边界的倒三角,然后旋转4次就可以遍历所有的情况.所以二分极差,把最大值 ...
- 【数学】【CF27E】 Number With The Given Amount Of Divisors
传送门 Description 给定一个正整数\(n\),输出最小的整数,满足这个整数有n个因子 Input 一行一个整数\(n\) Output 一行一个整数,代表答案. Hint \(1~\leq ...
- 用一次FastDFS
FastDFS c编写的分布式文件系统,用于搭建文件服务器集群提供文件的上传.下载 特点 冗余备份 负载均衡 线性扩容 高性能.高可用 FastDFS架构 Tracker server 负载均衡和调度 ...
- Vue.js随笔三(npm init webpack my-project指令安装失败解决方案)
如果没有安装淘宝给的镜像就先安装一下,指令如下,对!就是如此简单: npm install -g cnpm -registry=https://registry.npm.taobao.org 首先输入 ...