单例模式是一个很常用的创造型模式,其主要目的是控制生成对象的唯一性。在java中实例化对象的方法主要通过new(还有反射、clone等,本篇不讨论)。为了限制new方法的使用,首先要将单例类的构造函数设置为private,如此客户端就无法直接调用构造函数来new对象了。
下图是单例模式的一个简单类图:
通过静态方法getInstance获取对象实例,一种方式是通过static初始化模块来实例化这个单例对象,这种方式在该类被加载时实例,由于类的初始化过程是唯一的所以这种单例模式也是线程安全的。
public class OneClass {
private static OneClass instance=new OneClass();
private OneClass(){
}
public static OneClass getInstance(){
return instance;
}
public void func(){
System.out.println(this.toString());
}
public static void main(String args[]){
OneClass one=OneClass.getInstance();
one.func();
}
}
另外一种方式在第一次获取getInsatnce时进行实例化,这种方式明显在多线程情况下需要对getInstance进行加锁控制。下面这段代码是未对getInstance进行加锁,由于构造函数的2秒暂停,可以发现最终结果子线程和main线程打印出的对象id是不同的。解决的方法很简单对getInstance方法添加synchronized关键字即可。
public class OneClass {
private static OneClass instance=null;
private OneClass(){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static OneClass getInstance(){
if(instance==null){
instance=new OneClass();
}
return instance;
}
public void func(){
System.out.println(this.toString());
}
public static void main(String args[]){
new Thread(new Runnable(){
public void run() {
OneClass two=OneClass.getInstance();
two.func();
}
}).start();;
OneClass one=OneClass.getInstance();
one.func();
}
}
当然也可以将锁移动到内部具体实例化的代码段,来缩小加锁区域,其中需要额外注意的是在获取到锁之后需要再次判断下instance引用是否为空(因为线程获得到锁之后会继续执行下去):
public static OneClass getInstance(){
if(instance==null){
synchronized(OneClass.class){
if(instance==null){
instance=new OneClass();
}
}
}
return instance;
}
最后给出一种最简洁的写法,通过内部类来获取单例,由于内部类在调用getInstance的时候才会被初始化,因此达到懒汉模式:
public class OneClassBest {
private OneClassBest(){
}
private static class ClassHandle{
private static OneClassBest oneInstace=new OneClassBest();
}
public static OneClassBest getInstance(){
return ClassHandle.oneInstace;
}
}
- 大小: 7 KB
分享到:
相关推荐
C++单例设计模式,单例模式 C++单例设计模式,单例模式
"设计模式单例模式和工厂模式综合应用"的主题聚焦于两种常用的设计模式:单例模式和工厂模式,并探讨它们如何协同工作来实现高效、灵活的代码结构。这个主题尤其适用于Java编程语言,因为Java的面向对象特性使得设计...
李建忠老师的设计模式-单例模式讲解,示例以C++编程语言呈现。
单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式常用于控制共享资源,如数据库连接池、线程池或者日志系统等,确保这些资源在整个应用程序中只被创建一次。 单例模式的核心...
单例模式是软件设计模式中的一种经典模式,它保证了类只有一个实例存在,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于管理共享资源,如数据库连接池、线程池或者配置文件等。结合工厂模式,...
单例模式是一种常用的设计模式,它的核心思想是在整个应用程序中,一个类只能有一个实例存在。单例模式常用于控制资源的共享,例如数据库连接池、日志服务等。单例模式有多种实现方式,常见的包括懒汉式、饿汉式以及...
单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。 比如在某个服务器程序中,该服务器的配置信息存放...
设计模式-单例模式脑图
单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个全局访问点。这种模式常用于控制资源的共享,如数据库连接、线程池或配置对象等。在Java中,实现单例模式有多种方法,包括懒汉式...
细心整合和单例模式和工厂模式的几种模型,懒汉式,饿汉式,如何并发操作模式,等都有详细讲解
单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池或者配置管理等。 在Java中...
python 设计模式之单例模式
单例模式是一种常见的设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机的驱动程序对象常被设计成单例。这些应用都或多或少...
目录 单例模式的概念 单例模式的要点 单例模式类图 单例模式归类 单例模式的应用场景 单例模式解决的问题 单例模式的实现方式 单例模式实现方式对比 单例模式的概念 单例模式,顾名思义就是只有一个实例,并且由它...
单例模式是一种限制类实例化次数为一个的设计模式,常用于全局共享对象,如数据库连接池、线程池等。在Java中实现单例模式有多种方法,包括懒汉式(线程不安全)、饿汉式(线程安全)、双重检查锁定(DCL,线程安全...
单例模式是软件设计模式中的经典模式之一,其主要目的是控制类的实例化过程,确保在应用程序的整个生命周期中,某个类只有一个实例存在。这样的设计通常适用于那些需要频繁创建和销毁,但资源消耗较大的对象,如...
入名所示,该文件为最详细的Java单例模式讲解并附有讲解代码。主要讲了单例模式的几种方法,懒汉模式、饿汉模式、静态内部类模式。着重讲解了懒汉模式下怎么实现线程安全。饿汉模式和静态内部类模式如何设置能够避免...
单例模式是 Java 设计模式中的一种常用的设计模式,旨在保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式的目的是为了保证在一个进程中,某个类有且仅有一个实例。 实现单例模式的步骤: 1. 只有 ...
本资源“一例读懂设计模式-单例模式、简单工厂模式.zip”旨在帮助初学者通过实例深入理解这两种重要设计模式:单例模式和简单工厂模式。以下是关于这两个模式的详细讲解。 1. **单例模式**: 单例模式是一种限制类...
### 设计模式总结:模板设计模式与单例模式 #### 模板设计模式 模板设计模式是一种行为型设计模式,它定义了一个算法的骨架,并允许子类为算法的某些步骤提供具体的实现。通过这种方式,算法的基本流程保持不变,...