前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之单例模式实践

设计模式之单例模式实践

作者头像
Java技术栈
发布2018-03-29 17:35:13
6200
发布2018-03-29 17:35:13
举报
文章被收录于专栏:Java技术栈Java技术栈

概念

单例模式即一个JVM内存中只存在一个类的对象实例

分类

1、懒汉式

类加载的时候就创建实例

2、饿汉式

使用的时候才创建实例

当然还有其他的生成单例的方式,双重校验锁,枚举和静态内部类,文中会有介绍

实践

懒汉式

1)线程不安全,不可用

public class Singleton {

private static Singleton instance;

private Singleton (){}

public static Singleton getInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

2)线程安全,同步方法,效率低,不推荐

public class Singleton {

private static Singleton instance;

private Singleton (){}

public static synchronized Singleton getInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

3)线程不安全,会产生多个实例,不可用

public class Singleton {

private static Singleton singleton;

private Singleton() {}

public static Singleton getInstance() {

if (singleton == null) {

synchronized (Singleton.class) {

singleton = new Singleton();

}

}

return singleton;

}

}

饿汉式,无线程安全问题,不能延迟加载,影响系统性能

4)

public class Singleton {

private static Singleton instance = new Singleton();

private Singleton (){}

public static Singleton getInstance() {

return instance;

}

}

5)

public class Singleton {

private static Singleton instance = null;

static {

instance = new Singleton();

}

private Singleton (){}

public static Singleton getInstance() {

return instance;

}

}

6)双重校验锁,线程安全,推荐使用

public class Singleton {

private static volatile Singleton singleton;

private Singleton() {}

public static Singleton getInstance() {

if (singleton == null) {

synchronized (Singleton.class) {

if (singleton == null) {

singleton = new Singleton();

}

}

}

return singleton;

}

}

7)静态内部类,线程安全,主动调用时才实例化,延迟加载效率高,推荐使用

public class Singleton {

private static class SingletonHolder {

private static final Singleton INSTANCE = new Singleton();

}

private Singleton (){}

public static final Singleton getInstance() {

return SingletonHolder.INSTANCE;

}

}

8)枚举类型,无线程安全问题,避免反序列华创建新的实例,很少使用

public enum Singleton {

INSTANCE;

public void whateverMethod() {

}

}

注意事项

1、考虑多线程问题

2、单例类构造方法要设置为private类型禁止外界new创建

private Singleton() {}

3、如果类可序列化,考虑反序列化生成多个实例问题,解决方案如下

private Object readResolve() throws ObjectStreamException {

// instead of the object we're on, return the class variable INSTANCE

return INSTANCE;

}

使用场景

1、工具类对象

2、系统中只能存在一个实例的类

3、创建频繁或又耗时耗资源且又经常用到的对象

下面是单例模式在JDK的应用

另外,spring容器中的实例默认是单例饿汉式类型的,即容器启动时就实例化bean到容器中,当然也可以设置懒汉式defalut-lazy-init="true"为延迟实例化,用到时再实例化。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java技术栈 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档