Java设计模式:单例模式

单例模式

一个类有且仅有一个实例,并且自行实例化向整个系统提供。

单例模式分类

  • 懒汉模式:指全局的单例实例在第一次被使用时构建。
  • 饿汉模式:指全局的单例实例在类装载时构建。

懒汉模式设计

package com.singleton;

//此为懒汉式 单例,但不是线程安全的
public class Singleton {

	//先把唯一对象生成好
    //初始化为空,只有当调用的时候才生成
	private static Singleton singleleton = null;
	
	//为private 只有自己能访问
	private Singleton() 
	{
		
	}
	
	public static Singleton getInstance()
	{
		if(singleleton==null) {
			singleleton = new Singleton();
		}
		return singleleton;//把唯一对象实例返回
	}
}

饿汉模式

package com.singleton;

public class HungrySingleton {

    // 私有化构造方法,防止外部实例化
    private HungrySingleton() {}

    // 饿汉模式在类加载的时候,对象就已经被实例化
    private static HungrySingleton hungrySingleton = new HungrySingleton();

    // 获取实例的方法
    public static HungrySingleton getInstance() {
        return hungrySingleton;
    }
}

分析

这⾥实现了懒汉式的单例,但是熟悉多线程并发编程的朋友应该可以看出,在多线程并发下这样的实现是⽆法保证实例实例唯⼀的(即线程不安全),甚⾄可以说这样的实现是完全错误的,下⾯我们就来看⼀下多线程并发下的执⾏情况,这⾥为了看到效果,我们对上⾯的代码做⼀⼩点修改:

package com.singleton;

public class DCLSingleton {

	//使用volatile关键字 保证变量可见性
	volatile private static DCLSingleton dclSingleleton;
	
	private DCLSingleton() {}
	
	public static DCLSingleton getInstance() {
		
		try {
			if(dclSingleleton!=null) {
				
			}else {
				//创建实例之前可能会有一些准备性的耗时操作
				Thread.sleep(300);
			
				synchronized (DCLSingleton.class) {
					if(dclSingleleton==null) {//二次检查
						
						dclSingleleton = new DCLSingleton();
					}
				}
			}
		} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
		}
		return dclSingleleton;
	}
}

以上为Double Check Locking 双检查锁机制(推荐使用)为了达到线程安全,⼜能提⾼代码执⾏效率。

这⾥在声明变量时使⽤了volatile关键字(关于volatile关键字解析)来保证其线程间的可⻅性;在同步代码块中使⽤⼆次检查,以保证其不被重复实例化。集合其⼆者,这种实现⽅式既保证了其⾼效性,也保证了其线程安全性。
另外说明这里所加的“Thread.sleep(300);”是为了检验测试,实际编写中不用添加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值