java设计模式之单例模式

本文深入探讨Java设计模式中的单例模式,详细讲解了饿汉式、懒汉式及内部类实现方式,分析了每种方式的特点与适用场景,特别强调了线程安全性和效率的平衡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java设计模式之单例模式

说明

单例模式确保某一个类在应用和使用中从始至终只有一个只有一个实例
步骤:
(1)私有化该类的构造函数
(2)通过new在本类中创建一个本类对象
(3)定义一个公有的方法,将在该类中所创建的对象返回

单例模式的饿汉式[可用]
public class Singleton {
 
	private static Singleton instance=new Singleton();
	private Singleton(){};
	public static Singleton getInstance(){
		return instance;
	}
}

单例模式的饿汉式变换写法[可用]

public class Singleton{
 
	private static Singleton instance = null;
	
	static {
		instance = new Singleton();
	}
 
	private Singleton() {};
 
	public static Singleton getInstance() {
		return instance;
	}
}
单例模式懒汉式双重校验锁[推荐用]
解释一下:
注意:
instance = new Singleton()这句,这并非是一个原子操作,事实上在 JVM 中这句话大概做了下面 3 件事情。

    1.给 instance 分配内存
    2.调用 Singleton 的构造函数来初始化成员变量
    3.将instance对象指向分配的内存空间(执行完这步 instance 就为非 null 了)
说白了,当第一个线程执行,instance = new Singleton()完这句代码,instance并不一定刷新到主内存,可能只是第一个线程的本地内存刷新了,然而线程间本地内存是不可见的,所以存在另外一个线程拿到会不一样,使用volatile 关键字将保证其可见性,synchronized 保证其原子性,这样才不会出现多线程问题


public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}   
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
} 	
内部类[推荐用]


package com.test.singleton;
 
/**
 * 
 * Description:静态内部类 这种方式同样利用了classLoder的机制来保证初始化instance时只有一个线程
 * 这种方式是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,
 * 只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。
*类装载的机制来保证初始化实例时只有一个线程
 * 
 * @author 2016年11月17日上午10:13:54
 */
public class Singleton3 {
 
	// 内部类
	public static class SingletonHolder {
		private static final Singleton3 single = new Singleton3();
	}
 
	private Singleton3() {
	}
 
	public static final Singleton3 getInstance() {
		return SingletonHolder.single;
	}
 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值