文档章节

设计模式-单例模式(Singleton)

liweijun_
 liweijun_
发布于 2017/06/25 08:31
字数 553
阅读 5
收藏 0
点赞 0
评论 0

单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。

如何实现?

  1. 单例类,私有化构造器。
  2. 在类的内部创建一个类的实例。
  3. 通过方法来返回实例。

例子:

饿汉式

//单例类-饿汉式
class Singleton{
	
	//私有化构造方法,使其不可以在类的外部创建该类的对象。
	private Singleton(){}
	
	//实例化一个对象。
	private static Singleton singleton=new Singleton();
	
	//提供静态方法,外部通过类名调用。
	public static Singleton getSingleton(){
		
		return singleton;
	}
	
}

懒汉式:存在线程安全问题。

//单例类-懒汉式:多并发情况下 存在线程安全问题。
class Singleton1{
	
	private Singleton1(){}
	
	private static Singleton1 singleton1;
	
	public static Singleton1  getSingleton1(){	
		if(singleton1==null){
			singleton1=new Singleton1();
		}
		return singleton1;
	}
}

解决方案代码:

//懒汉式解决安全问题:
class Singleton2{
	
	private Singleton2(){
		
	}
	
	private static Singleton2 instance;
	
	public static Singleton2 getInstance(){
		
        //第一次判断:当前实例为null,也就是实例还未创建时才进行同步,否则就直接返回,
        //这样就节省了很多无谓的线程等待时间。
		if(instance==null){
		//使用同步代码块解决;对于静态方法,使用当前类本身当做锁。
		synchronized (Singleton2.class) {
             //第2次判断:如果在第一次判断时有A线程和B线程都在同步块外面判断了instance为null,
             //结果A线程首先获得了线程锁,进入了同步块,然后A线程会创造一个实例。
             //此时instance已经被赋予了实例,A线程退出同步代码块,直接返回了第一个创造的实例。
             //此时B线程获得线程锁,也进入同步块,此时A线程其实已经创造好了实例,B线程正常情况应该直接返回的,
             //但是因为同步块里没有判断是否为null,直接就是一条创建实例的语句,所以B线程也会创造一个实例返回,
             //此时就造成创造了多个实例的情况。
			if (instance == null) {
				instance = new Singleton2();
			}
		}}
		return instance;
	}
	
	
}

 

 

jdk中的runtime单例类:

恩恩

 

 

 

© 著作权归作者所有

共有 人打赏支持
liweijun_
粉丝 1
博文 3
码字总数 2147
作品 0
深圳
程序员

暂无相关文章

Java Web如何操作Cookie的添加修改和删除

创建Cookie对象 Cookie cookie = new Cookie("id", "1"); 修改Cookie值 cookie.setValue("2"); 设置Cookie有效期和删除Cookie cookie.setMaxAge(24*60*60); // Cookie有效时间 co......

二营长意大利炮 ⋅ 今天 ⋅ 0

【每天一个JQuery特效】淡入淡出显示或隐藏窗口

我是JQuery新手爱好者,有时间就练练代码,防止手生,争取每天一个JQuery练习,在这个博客记录下学习的笔记。 本特效主要采用fadeIn()和fadeOut()方法显示淡入淡出的显示效果显示或隐藏元...

Rhymo-Wu ⋅ 今天 ⋅ 0

Spring JDBC使用方法

普通实现: 1、创建数据表customer。 可以使用任何数据库实现,在项目中要引入相应数据库驱动包并配置相应数据库连接。 2、创建Customer pojo。 Customer类的属性对应数据库的属性,除了为每...

霍淇滨 ⋅ 今天 ⋅ 0

Contos 7 安装Jenkins

Jenkins是一款能提高效率的软件,它能帮你把软件开发过程形成工作流,典型的工作流包括以下几个步骤 开发 提交 编译 测试 发布 有了Jenkins的帮助,在这5步中,除了第1步,后续的4步都是自动...

欧虞山 ⋅ 今天 ⋅ 0

revel

revel install go get github.com/revel/revelgo get github.com/revel/cmd create new app revel new git.oschina.net/zdglf/myapp run app revel run git.oschina.net/zdglf/myapp ot......

zdglf ⋅ 今天 ⋅ 0

49. Group Anagrams - LeetCode

Question 49. Group Anagrams Solution 思路:维护一个map,key是输入数组中的字符串(根据字符排好序) Java实现: public List<List<String>> groupAnagrams(String[] strs) { Map<Strin......

yysue ⋅ 今天 ⋅ 0

spring Email

使用spring发Email其实就是使用spring自己封装携带的一个javamail.JavaMailSenderImpl类而已。这个类可以当一个普通的java对象来使用,也可以通过把它配置变成spring Bean的方式然后注入使用...

BobwithB ⋅ 今天 ⋅ 0

spark 整理的一些知识

Spark 知识点 请描述spark RDD原理与特征? RDD全称是resilient distributed dataset(具有弹性的分布式数据集)。一个RDD仅仅是一个分布式的元素集合。在Spark中,所有工作都表示为创建新的...

tuoleisi77 ⋅ 今天 ⋅ 0

思考

时间一天天过感觉自己有在成长吗?最怕的是时光匆匆而过,自己没有收获!下面总结下最近自己的思考。 认识自己 认识另一个自己,人们常说要虚心听取别人意见和建议。然而人往往是很难做到的,...

hello_hp ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部