文档章节

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

liweijun_
 liweijun_
发布于 2017/06/25 08:31
字数 553
阅读 7
收藏 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
博文 9
码字总数 2147
作品 0
深圳
程序员
私信 提问

暂无文章

对接比特币钱包的PHP开发包

BtcTool是一个基于第三方服务和离线裸交易实现的PHP比特币应用开发包,适合不希望部署本地 节点旳PHP开发者,开发包主要包含以下特性: 利用第三方服务获取指定地址的utxo集合 离线生成消费裸...

汇智网教程
9分钟前
0
0
【自用】 VHD to VHDX

VHDX: 在VHD 2TB 的基础上提供 64TB的容量。 支持逻辑扇区大小为 4KB,和每块的大小为 256MB,来优化虚拟磁盘性能。 比VHD提供更高的安全性、可靠性和性能。 convert-VHD –path d:\Hyper-v...

Tensor丨思悟
21分钟前
0
0
30 岁转行做Python开发晚吗?而且是零基础

最近有小伙伴问小编,30 岁转行做Python开发晚吗? 小编想说,其实无论男女,只要想学,有这个动力,就直接去行动。无论年龄,无论性别,只要你想一直勇往直前,那么想做的就去做吧~这里有一...

糖宝lsh
32分钟前
7
0
详解Spring中的Profile

前言 由于在项目中使用Maven打包部署的时候,经常由于配置参数过多(比如Nginx服务器的信息、ZooKeeper的信息、数据库连接、Redis服务器地址等),导致实际现网的配置参数与测试服务器参数混淆...

watermelon11
47分钟前
4
0
phper必知必会(二)

  1.说说你对进程,线程以及协程的理解      进程:是系统进行资源分配和调度的基本单位,是基本操作系统结构的基础。进程是程序基本执行的实体。进程与进程之间是独立的,拥有完全独立...

SEOwhywhy
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部