Java单例设计模式的理解与常规实现方式

简介:

1:Java中单例模式是一种常见的设计模式,单例模式有以下特点:

  单例类只能有一个实例。

  单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。

  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

2:java中单例模式的写法也有很多种,我在这里列举几张常用的方式:

 1、饿汉式,线程安全 但效率比较低:

/**

  • 单例模式的实现:饿汉式,线程安全 但效率比较低
    */

public class SingletonTest {

// 定义一个私有的构造方法
private SingletonTest() {  
}  

// 将自身的实例对象设置为一个属性,并加上static和final修饰符
private static final SingletonTest instance = new SingletonTest();  

// 静态方法返回该类的实例
public static SingletonTest getInstancei() {  
    return instance;  
}  

}

 2、懒汉式,非线程安全:

/**

  • 单例模式的实现:懒汉式,非线程安全
  • */

public class SingletonTest {

// 定义私有构造方法(防止通过 new SingletonTest()去实例化)
private SingletonTest() {   
}   

// 定义一个SingletonTest类型的变量(不初始化,注意这里没有使用final关键字)
private static SingletonTest instance;   

// 定义一个静态的方法(调用时再初始化SingletonTest,但是多线程访问时,可能造成重复初始化问题)
public static SingletonTest getInstance() {   
    if (instance == null)   
        instance = new SingletonTest();   
    return instance;   
}   

}

 3、懒汉式,线程安全简单实现  :

/**

  • 单例模式的实现:懒汉式,线程安全简单实现
  • */

public class SingletonTest {

// 定义私有构造方法(防止通过 new SingletonTest()去实例化)
private SingletonTest() {   
}   

// 定义一个SingletonTest类型的变量(不初始化,注意这里没有使用final关键字)
private static SingletonTest instance;   

// 定义一个静态的方法(调用时再初始化SingletonTest,使用synchronized 避免多线程访问时,可能造成重的复初始化问题)
public static synchronized  SingletonTest getInstance() {   
    if (instance == null)   
        instance = new SingletonTest();   
    return instance;   
}   

}

 4、线程安全 并且效率高  单例模式最优方案

/**

  • 单例模式最优方案
  • 线程安全 并且效率高
  • */

public class SingletonTest {

// 定义一个私有构造方法
private SingletonTest() { 
 
}   
//定义一个静态私有变量(不初始化,不使用final关键字,使用volatile保证了多线程访问时instance变量的可见性,避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用)
private static volatile SingletonTest instance;  

//定义一个共有的静态方法,返回该类型实例
public static SingletonTest getIstance() { 
    // 对象实例化时与否判断(不使用同步代码块,instance不等于null时,直接返回对象,提高运行效率)
    if (instance == null) {
        //同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建)
        synchronized (SingletonTest.class) {
            //未初始化,则初始instance变量
            if (instance == null) {
                instance = new SingletonTest();   
            }   
        }   
    }   
    return instance;   
}   

}

 5、静态内部类方式

/**

  • 静态内部类方式
    *

*/
public class Singleton {

 private static class SingletonTest {  
 private static final Singleton INSTANCE = new Singleton();  
 }  
 private Singleton (){}
 public static final Singleton getInstance() {  
     return SingletonTest.INSTANCE;  
 }  

}
以上单例如设计模式即使有多重检查锁也可以通过反射破坏单例

6、目前最为安全的实现单例的方法是通过内部静态enum的方法来实现,因为JVM会保证enum不能被反射并且构造器方法只执行一次,事例如下:

/**

  • 使用枚举的单例模式
    *
  • @author uu
    */

public class EnumSingleton{

private EnumSingleton(){}
public static EnumSingleton getInstance(){
    return Singleton.INSTANCE.getInstance();
}

private static enum Singleton{
    INSTANCE;
    
    private EnumSingleton singleton;
    //JVM会保证此方法绝对只调用一次
    private Singleton(){
        singleton = new EnumSingleton();
    }
    public EnumSingleton getInstance(){
        return singleton;
    }
}

public static void main(String[] args) {

EnumSingleton obj0 = EnumSingleton.getInstance();
EnumSingleton obj1 = EnumSingleton.getInstance();
//输出结果:obj0==obj1?true
System.out.println("obj0==obj1?" + (obj0==obj1));

}
}

在此浅谈一下个人理解,希望对大家有所帮助。

相关文章
|
28天前
|
设计模式 算法 Java
Java中的设计模式:提升代码质量的秘诀
【8月更文挑战第23天】在Java开发中,设计模式是提高代码可读性、可维护性和扩展性的强有力工具。本文通过浅显易懂的语言和实际案例,探讨几种常见的设计模式及其在Java中的应用,旨在帮助开发者更好地理解并运用这些模式来优化自己的代码结构。
39 2
|
6天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
2天前
|
设计模式 Java
Java设计模式:组合模式的介绍及代码演示
组合模式是一种结构型设计模式,用于将多个对象组织成树形结构,并统一处理所有对象。例如,统计公司总人数时,可先统计各部门人数再求和。该模式包括一个通用接口、表示节点的类及其实现类。通过树形结构和节点的通用方法,组合模式使程序更易扩展和维护。
Java设计模式:组合模式的介绍及代码演示
|
6天前
|
设计模式 安全 算法
【Java面试题汇总】设计模式篇(2023版)
谈谈你对设计模式的理解、七大原则、单例模式、工厂模式、代理模式、模板模式、观察者模式、JDK中用到的设计模式、Spring中用到的设计模式
【Java面试题汇总】设计模式篇(2023版)
|
6天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
6天前
|
设计模式 存储 安全
设计模式——设计模式介绍和单例设计模式
饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全)、懒汉式(线程安全,同步方法)、懒汉式(线程不安全,同步代码块)、双重检查(推荐,线程安全、懒加载)、静态内部类(推荐)、枚举(推荐)
设计模式——设计模式介绍和单例设计模式
|
21天前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
37 2
|
21天前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
30 1
|
21天前
|
设计模式 Java
重构你的代码:探索Java中的混合、装饰器与组合设计模式
【8月更文挑战第30天】在软件开发中,设计模式为特定问题提供了结构化的解决方案,使代码更易理解、维护及扩展。本文将介绍三种常用的 Java 设计模式:混合模式、装饰器模式与组合模式,并附有示例代码展示实际应用。混合模式允许通过继承多个接口或抽象类实现多重继承;装饰器模式可在不改变对象结构的情况下动态添加新功能;组合模式则通过树形结构表示部分-整体层次,确保客户端处理单个对象与组合对象时具有一致性。
15 1
|
1月前
|
设计模式 算法 安全
Java编程中的设计模式:提升代码的可维护性和扩展性
【8月更文挑战第19天】在软件开发的世界里,设计模式是解决常见问题的一种优雅方式。本文将深入探讨Java编程语言中常用的几种设计模式,并解释如何通过这些模式来提高代码的可维护性和扩展性。文章不涉及具体的代码实现,而是侧重于理论和实践相结合的方式,为读者提供一种思考和改善现有项目的新视角。