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实现客房管理系统

    2022-10-15 23:56:33
  • C# 屏蔽关键字的实现方法

    2023-10-10 15:15:50
  • c#实现一元二次方程求解器示例分享

    2023-01-03 21:15:30
  • Servlet+JDBC实现登陆功能的小例子(带验证码)

    2021-05-29 03:04:25
  • SpringBoot+hutool实现图片验证码

    2021-06-17 02:55:27
  • 详解Mybatis的缓存

    2022-10-23 22:49:13
  • Android中在GridView网格视图上实现item拖拽交换的方法

    2022-07-13 01:26:04
  • SpringBoot事件机制相关知识点汇总

    2021-05-29 06:53:45
  • Java硬币翻转倍数递增试算实例

    2021-09-29 08:39:22
  • Unity实现苹果手机Taptic震动

    2023-02-15 07:18:47
  • 解决Spring在Thread中注入Bean无效的问题

    2022-06-26 13:03:59
  • springcloud中Ribbon和RestTemplate实现服务调用与负载均衡

    2022-06-30 14:58:45
  • Java的动态绑定与双分派_动力节点Java学院整理

    2021-07-14 11:18:50
  • 浅谈Java中的Filter过滤器

    2023-07-23 10:00:08
  • C++ 中二分查找递归非递归实现并分析

    2023-06-19 06:51:31
  • Java中统计字符个数以及反序非相同字符的方法详解

    2022-10-21 10:48:02
  • Java Swing中的文本框(JTextField)与文本区(JTextArea)使用实例

    2022-08-15 00:17:46
  • C#递归实现显示文件夹及所有文件并计算其大小的方法

    2023-09-13 01:56:01
  • java字符串的重要使用方法以及实例

    2023-11-13 23:11:51
  • C#程序打成 一键安装包-InstallShield教程

    2022-11-19 06:02:07
  • asp之家 软件编程 m.aspxhome.com