java单例模式学习示例

时间:2022-03-29 19:03:41 

单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

首先看一个经典的单例实现。


public class Singleton {

private static Singleton uniqueInstance = null;

private Singleton() {

   // Exists only to defeat instantiation.

}

public static Singleton getInstance() {   if (uniqueInstance == null) {

       uniqueInstance = new Singleton();

   }

   return uniqueInstance;

}

// Other methods...
}

Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。(事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在。)

但是以上实现没有考虑线程安全问题。所谓线程安全是指:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。显然以上实现并不满足线程安全的要求,在并发环境下很可能出现多个Singleton实例。


//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1 {
//私有的默认构造子
private Singleton1() {}
//已经自行实例化
private static final Singleton1 single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}

//懒汉式单例类.在第一次调用的时候实例化
public class Singleton2 {
//私有的默认构造子
private Singleton2() {}
//注意,这里没有final
private static Singleton2 single=null;
//静态工厂方法
public synchronized static Singleton2 getInstance() {
if (single == null) {
single = new Singleton2();
}
return single;
}
}

标签:单例模式
0
投稿

猜你喜欢

  • Java Code Cache满导致应用性能降低问题解决

    2021-06-18 18:17:56
  • 详解ArrayList的扩容机制

    2022-06-18 05:56:32
  • idea搭建SSM框架遇踩的坑(附完整过程)

    2023-06-23 09:53:07
  • java中javamail发送带附件的邮件实现方法

    2023-12-06 02:46:30
  • RocketMq深入分析讲解两种削峰方式

    2023-04-04 01:38:47
  • springboot 微信授权网页登录操作流程

    2022-12-12 08:26:19
  • springmvc用于方法鉴权的注解拦截器的解决方案代码

    2022-06-02 10:30:18
  • SpringIOC BeanDefinition的加载流程详解

    2023-11-25 18:06:22
  • 详解SpringBoot 快速整合MyBatis(去XML化)

    2022-08-19 16:42:54
  • java实现dijkstra最短路径寻路算法

    2021-10-23 06:29:58
  • Android切面编程知识点详解

    2023-05-05 04:18:04
  • 浅谈JVM中的JOL

    2022-10-06 15:44:49
  • C#实现创建标签PDF文件的示例代码

    2023-09-15 07:04:58
  • C#使用iTextSharp将PDF转成文本的方法

    2022-05-03 16:59:48
  • Mybatis查询多条记录并返回List集合的方法

    2023-08-08 05:16:48
  • 一起来学习Java IO的转化流

    2023-11-26 20:38:30
  • C#Process的OutputDataReceived事件不触发问题及解决

    2023-08-12 19:22:41
  • Java Springboot整合支付宝接口的教程详解

    2023-11-06 19:41:49
  • java判断某个点是否在所画多边形/圆形内

    2022-09-30 23:50:45
  • Redis原子计数器incr,防止并发请求操作

    2021-07-03 13:35:15
  • asp之家 软件编程 m.aspxhome.com