首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实现单例的几种方式

实现单例的几种方式

作者头像
九州暮云
发布2019-08-21 11:20:15
2620
发布2019-08-21 11:20:15
举报
文章被收录于专栏:九州牧云九州牧云

一、饿汉式单例

饿汉式单例:在使用该类的静态成员时,无论有没有使用单例类,都会创建单例对象

/**
 * 饿汉式单例:在使用该类的静态成员时,无论有没有使用单例类,都会创建单例对象
 * 
 * @author wangpeng
 *
 */
public class Singleton {

	private Singleton() {
		// TODO Auto-generated constructor stub
		System.out.println("Singleton is create");
	}

	public static int staticMember = 0;

	private static Singleton instance = new Singleton();

	public static Singleton getInstance() {
		return instance;
	}

	public static void createString() {
		System.out.println("createString in Singleton");
	}

	public static void main(String[] args) {
		// 输出Singleton is create和createString in Singleton
		Singleton.staticMember = 1;
		// Singleton.createString();
	}
}

二、懒汉式单例

懒汉式单例:通过判断单例对象是否为null和加同步关键字,保证只在第一次使用单例类创建单例类,避免创建重量级单例类慢的问题。在高并发情况下,同步关键字的使用可能会降低性能

/**
 * 懒汉式单例:通过判断单例对象是否为null和加同步关键字,保证只在第一次使用单例类创建单例类,避免创建重量级单例类慢的问题。在高并发情况下,同步关键字的使用可能会降低性能
 * 
 * @author wangpeng
 *
 */
public class LazySingleton {

	private LazySingleton() {
		System.out.println("LazySingleton is create");
	}

	public static int staticMember = 0;

	private static LazySingleton instance = null;

	public static synchronized LazySingleton getInstance() {
		if (instance == null) {
			instance = new LazySingleton();
		}
		return instance;
	}

	public static void createString() {
		System.out.println("createString in Singleton");
	}

	public static void main(String[] args) {
		// 只输出createString in Singleton
		LazySingleton.staticMember = 1;
		LazySingleton.createString();
	}
}

三、内部类单例

使用内部类来实现单例:(1)由于类加载是单线程的,故可以替代synchronized关键字解决并发问题。 (2)当单例类加载时,其内部类不会初始化。只当调用getInstance方法时,才会创建单例类

/**
 * 使用内部类来实现单例:(1)由于类加载是单线程的,故可以替代synchronized关键字解决并发问题。
 * (2)当单例类加载时,其内部类不会初始化。只当调用getInstance方法时,才会创建单例类
 * 
 * @author wangpeng
 *
 */
public class StaticSingleton {

	private StaticSingleton() {
		// TODO Auto-generated constructor stub
		System.out.println("StaticSingleton is create");
	}

	/**
	 * 持有单例对象的内部类
	 */
	private static class SingletonHolder {
		private static StaticSingleton instance = new StaticSingleton();
	}

	public static StaticSingleton getInstance() {
		return SingletonHolder.instance;
	}

	public static void createString() {
		System.out.println("createString in Singleton");
	}

	public static void main(String[] args) {
		StaticSingleton.getInstance();
	}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、饿汉式单例
  • 二、懒汉式单例
  • 三、内部类单例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档