Java单例模式

本文深入探讨了Java中实现单例模式的四种常见方法,包括只适用于单线程的简单实例化、适合多线程环境的懒汉式、采用静态块的饿汉式以及利用静态内部类的方式。每种方法都有其适用场景和优缺点。

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

java单例模式在开发中经常使用,小编今天总结了下已知几种方法。

方法一:只适合单线程。(不建议使用)

package com.mec.about_singleton;

public class AboutSingleton {
	private static AboutSingleton me = null; //me是自己
	
	private AboutSingleton() {
	}
	
	public static AboutSingleton newInstance() {
		//如果自己被实例化过就返回自己,如果没有就new一个自己。
		if(me == null) {
			me = new AboutSingleton(); 
		}
		return me;
	}
	
}

方法二:适合多线程(懒汉式)。

package com.mec.about_singleton;

public class AboutSingleton {
	//这里强烈建议加volatile,因为是多线程环境,要内存器拒绝优化。
	private volatile static AboutSingleton me = null; 
	
	private AboutSingleton() {
	}
	
	public static AboutSingleton newInstance() {
		//如果自己被实例化过就返回自己,如果没有就new一个自己。
		if(me == null) {
			//因为是多线程所以要加锁,锁可以加到方法上,也可以加到这里。
			//但是锁加到方法上,会影响程序运行效率。因为该类是多线程,可能同时调用很多newInstance();
			//这里加到if里面会很大提升效率。
			synchronized (AboutSingleton.class) {
				//这里必须要再次判断因为在多线程环境下,有可能多个线程都运行到了if里面。
				//也就是me=null成立。此时一个线程把me值改了,其他的线程就不应该再次实例化。
				if(me == null) {
					me = new AboutSingleton();
				}
			}
		}
		return me;
	}
}

方法三,适合多线程使用,采用静态块(饿汉式),建议使用。

package com.mec.about_singleton;

public class AboutSingleton {
	//采用静态块初始化,保证单例。但是由于是静态块,所以在类装载时候就实例化了。
	private static final AboutSingleton me;
	
	static {
		me = new AboutSingleton();
	}
	
	private AboutSingleton() {
	}
	
	public static AboutSingleton newInstance() {
		//直接返回me就行;
		return me;
	}
}

方法四,适合多线程,采用静态内部类

package com.mec.about_singleton;

public class AboutSingleton {
	private AboutSingleton() {
		
	}
	
	//因为该类是static修饰所以会里面实例化一个AboutSingleton类。
	private static class Creatclass{
		private final static AboutSingleton me = new AboutSingleton();
	}
	
	public static AboutSingleton newInstance() {
		return Creatclass.me;
	}
}

以上为个人总结的四个方法。当然还有些其他方法。但是本质和这四种方法几乎相同。就不说了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值