第一讲、单例模式

1.定义

单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。

GOF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局方法。

2.为什么要使用单例模式?

在开发中,经常有如下需求:

  • 在多个线程之间,比如servlet环境,共享一个资源或者操作同一个对象。
  • 在整个程序空间使用全局变量,共享资源。
  • 大规模系统中,为了性能考虑,需要节省对象的创建时间等。

3.单例模式实现

  • 饿汉式
  • 懒汉式
  • 双重检查

4.代码演示

/*** 饿汉式    (是线程安全的)* */
public class Person {private String name;//静态常量private static final Person per = new Person();//构造函数私有化private Person() {}public String getName() {return name;}public void setName(String name) {this.name = name;}//提供一个全局的静态方法public static Person getPersonInstance() {return per;}
}
package test.com.singleton;
/*** 懒汉式    (线程不安全)**/
public class Person2 {private String name;private static Person2 per;//构造函数私有化private Person2() {}public String getName() {return name;}public void setName(String name) {this.name = name;}//提供一个全局的静态方法public static Person2 getPerson2Instance() {//因为new也是需要时间的,在多线程的情况下会出现第一个new未执行完,多次new的情况if(null == per) {per = new Person2();}return per;}
}
package test.com.singleton;
/*** 双重检查 (线程安全的)**/
public class Person3 {private String name;private static Person3 per;//构造函数私有化private Person3() {}public String getName() {return name;}public void setName(String name) {this.name = name;}//提供一个全局的静态方法public static Person3 getPerson3Instance() {if(null == per) {//加锁的意义在于确保第一次new执行完synchronized(Person3.class) {if(null == per) {per = new Person3();}}}return per;}}
package test.com.singleton;
/*** 测试**/
public class Main {public static void main(String[] args) {Person per = Person.getPersonInstance();Person per1 = Person.getPersonInstance();per.setName("李青");per1.setName("李小青");System.out.println(per.getName());//李小青System.out.println(per1.getName());//李小青System.out.println(per == per1);Person2 per3 = Person2.getPerson2Instance();Person2 per4 = Person2.getPerson2Instance();per.setName("赵青");per1.setName("赵小青");System.out.println(per.getName());//赵小青System.out.println(per1.getName());//赵小青System.out.println(per3 == per4);}
}

 5.相关文章

noteless

转载于:https://www.cnblogs.com/zheaven/p/9881448.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php怎么自动识别车牌号,车牌号自动识别系统怎么录入,很多你不知道的潜规则...

每次去商场之类的,车辆都需要自动识别下,不用下车就可以完成的操作,的确是方便的很。今天要讲的,就是关于车牌号自动识别系统怎么录入方面的内容,了解其中的原理,才能更好的去消费它。一、车牌识别系统车牌…

java学习(49):方法重载

定义一个computer类 public class computer { public void runSoftWor(vidio vedio){ System.out.println("视频长度是 "vedio.getLength()); } public void runSoftWor(Voice voice){System.out.println("歌曲的名字是 "voice.getTitle()); }public bool…

初始CSS

一.引入样式1.行内样式表<h1 style"color: red;font-size: 18px;">10-30</h1>2.内部样式表(在head标签里面,title标签下面)<style type"text/css">h2{color: yellow;font-size: 20px;}</style>优点方便在同页面中修改样式缺点不利…

java学习(50):子类继承会优先调用父类的构造器

定义一个父类 public class Parent { public void run(){ System.out.println(“我会跑步”); } public Parent(){ System.out.println(“我是爸爸”); } } 定义一个子类 public class Son extends Parent { public Son(){ System.out.println(“我是儿子”); } } 定义一个测试…

java去除不为null,java – 选择特定字段不为NULL的所有记录

我有一个名为stars的MySQL表,其中一个字段是id_num,默认值为NULL.我想通过java中的PreparedStatement选择id_num不为NULL的所有记录.现在我正在尝试这个&#xff1a;private final String idStarsSQL "select * from stars where id_num is not ?";...preparedStat…

Get Requests with Json Data Get Requests with Url Parameters

转载于:https://www.cnblogs.com/chengchengla1990/p/9883536.html

java学习(51):上转型对象

定义一个animal类 //java上转型对象 public class Animal { public String name“动物”; public String getName(){ return name; } public void action(){ System.out.println(“动物都在我的分类之中”); } public void feature(){ System.out.println(“我们都很帅气”); }…

php100教程源码,PHP100 视频教程 2012-2013版_PHP教程

教程名称&#xff1a;PHP100 视频教程 2012-2013版《PHP100系列视频教程》从2008年至今共计发布了近200多期的视频教程&#xff0c;涉及了WEB开发和php开发的方方面面&#xff0c;也是互联网中设计PHP开发最全面的教程系列。我们的教程就是让人人都可以学会WEB开发和PHP程序设计…

数组排序并找出元素索引--Where do I belong-FCC

数组排序并找出元素索引 先给数组排序&#xff0c;然后找到指定的值在数组的位置&#xff0c;最后返回位置对应的索引。 举例&#xff1a;where([1,2,3,4], 1.5) 应该返回 1。因为1.5插入到数组[1,2,3,4]后变成[1,1.5,2,3,4]&#xff0c;而1.5对应的索引值就是1。 同理&#xf…

java学习(52):抽象类

//定义一个人的抽象类 public abstract class Person { public abstract void eat();//吃饭 public abstract void drink();//喝水 public abstract void play();//玩 } //定义一个富人的抽象类 public abstract class Rich extends Person{ public abstract void buy();//买 p…

php 汉字分割,php支持中文字符串分割的函数

str_split不支持中文&#xff0c;利用mb_xx函数实现个/*** Convert a string to an array* param string $str* param number $split_length* return multitype:string*/function mb_str_split($str,$split_length1,$charset"UTF-8"){if(func_num_args()1){return pr…

python中使用正则模板匹配结果

正则配置处理类文件 util_tool.py #!/usr/bin/env python# -*- coding: utf-8 -*-"""Util Module for functionality shared between modules"""import redef combine_dicts(recs): """Combine a list of recs, appending val…

玩转oracle 11g(8):使用profile管理用户口令

使用profile管理用户口令 概述&#xff1a;profile是口令限制&#xff0c;资源限制的命令集合&#xff0c;当建立数据库的&#xff0c;oracle会自动建立名称为default的profile。当建立用户没有指定profile选项&#xff0c;那么oracle就会将default分配给用户。 1.账户锁定 概述…

RegexDemo6

package cn.zzDemo;/** 转换功能&#xff1a;* String类的public String replaceAll(String regex,* String replacement)使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 */public class RegexDemo6 {public static void main(String[] args) {// 定…

玩转oracle 11g(9):crud操作(亲测)

oracle支持的数据类型 字符类 char 定长 最大2000个字符。 例子&#xff1a;char(10) ‘小韩’前四个字符放‘小韩’&#xff0c;后添6个空格补全 如‘小韩’ varchar2(20) 变长 最大4000个字符。 例子&#xff1a;varchar2&#xff08;10&#xff09; ‘小韩’ oracle分配四个…

自己的路 php,生活感悟的句子:走自己的路,做自己的事

1、生活感悟的句子&#xff1a;当坚强成为你唯一的选择&#xff0c;你才知道自己可以有多坚强。别总把悲伤挂在脸上&#xff0c;每个人都有自己的故事&#xff1b;别把苦恼挂在嘴边&#xff0c;每个人都有自己的烦脑。这世界会打击每一个人。但经历过后&#xff0c;许多人会在受…

项目管理(1):备战pmp

1什么是项目  一家公司被收购  海外建设通讯站点  研究院研发一种新型的药物  中国当局缉拿新疆针刺袭击嫌疑人  野生动物湿地保护区的建立  与朋友一起旅游  房屋装修  ………………请问哪些是项目&#xff1f; 2项目的发展历程  1900年代早期&#xff0c;H…

神经网络中使用Batch Normalization 解决梯度问题

BN本质上解决的是反向传播过程中的梯度问题。 详细点说&#xff0c;反向传播时经过该层的梯度是要乘以该层的参数的&#xff0c;即前向有&#xff1a; 那么反向传播时便有&#xff1a; 那么考虑从l层传到k层的情况&#xff0c;有&#xff1a; 上面这个 便是问题所在。因为网络…

基于matlab的图像分割,基于MATLAB的图像分割算法研究毕业论文

作者姓名 XXX学号指导教师 XX教授学科专业 计算机科学与技术所在学院 计算机学院提交日期结 论数字图像目标分割与提取是数字图像处理和计算机视觉领域中一个备受关注的研究分支&#xff0c;也是图像处理领域的一个经典难题。经过近二十年的不断研究和探讨&#xf…

项目管理(2):备战pmp

1项目阶段与项目生命周期 将每一个项目划分为若干个阶段&#xff08;phases&#xff09;&#xff0c;以便提高管理控制&#xff0c;并提供与该项目实施组织的日常运作之间的联系 这些阶段合在一起称为项目生命周期 项目的生命周期用于定义一个项目的开始和结束 许多组织识别出一…