Java设计模式-单例模式(Singleton)

简介: Java设计模式-单例模式(Singleton)

文章目录

简介

单例模式:这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意:

1、单例类只能有一个实例。

2、单例类必须自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。

单例模式

实现单例模式需要以下几点:

  1. 私有化实例变量。
  2. 私有化构造器。
  3. 提供一个获取实例的静态方法。

饿汉式

/**

* 饿汉式

* 类加载到内存后,被实例化一个单例,JVM保证线程安全

* 简单实用 推荐实用,

* 唯一缺点:不管用不用,类装载是都完成实例化

*/

public class Singleton01 {

   private static final Singleton01 INSTANCE = new Singleton01();

   private Singleton01(){}

   private static Singleton01 getInstance(){

       return INSTANCE;

   }

   public static void main(String[] args) {

       Singleton01 s1 = Singleton01.getInstance();

       Singleton01 s2 = Singleton01.getInstance();

       System.out.println(s1 ==s2);

   }

}

懒汉式

/**

* 懒汉式

*/

public class Singleton02 {

   private static  Singleton02 INSTANCE;

   private Singleton02(){}

   public static  Singleton02 getInstance(){

       if(INSTANCE == null){

           try {

               Thread.sleep(1);

           } catch (InterruptedException e) {

               e.printStackTrace();

           }

           INSTANCE = new Singleton02();

       }

       return INSTANCE;

   }

}

懒汉式线程安全

/**

* 懒汉式

*/

public class Singleton03 {

   private static Singleton03 INSTANCE;

   private Singleton03(){}

   //线程安全6

   public static synchronized Singleton03 getInstance(){

       if(INSTANCE == null){

           try {

               Thread.sleep(1);

           } catch (InterruptedException e) {

               e.printStackTrace();

           }

           INSTANCE = new Singleton03();

       }

       return INSTANCE;

   }

}

懒汉式线程安全另外写法

/**

* 懒汉式

*/

public class Singleton04 {

   private static Singleton04 INSTANCE;

   private Singleton04(){}

   //线程安全6

   public static  Singleton04 getInstance(){

       if(INSTANCE == null){

           synchronized (Singleton04.class) {

               try {

                   Thread.sleep(1);

               } catch (InterruptedException e) {

                   e.printStackTrace();

               }

               INSTANCE = new Singleton04();

           }

       }

       return INSTANCE;

   }

}

懒汉式 双端检索模式

/**

* 懒汉式

* 可以通过synchronized 解决,但是也带来了效率下降

*/

public class Singleton05 {

   private  static volatile  Singleton05 INSTANCE;

   private Singleton05(){}

   //线程安全6

   public static Singleton05 getInstance(){

       if(INSTANCE == null){

           synchronized (Singleton05.class) {

               try {

                   Thread.sleep(1);

               } catch (InterruptedException e) {

                   e.printStackTrace();

               }

               INSTANCE = new Singleton05();

           }

       }

       return INSTANCE;

   }

}

总结

单例模式比较简单,保证只有一个实例就ok。

相关文章
|
24天前
|
设计模式 存储 前端开发
前端必须掌握的设计模式——单例模式
单例模式是一种简单的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。适用于窗口对象、登录弹窗等场景,优点包括易于维护、访问和低消耗,但也有安全隐患、可能形成巨石对象及扩展性差等缺点。文中展示了JavaScript和TypeScript的实现方法。
|
30天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
25 2
|
2月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
2月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
40 4
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
28 0
|
2月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
设计模式 安全 Java
Singleton单例模式(Java代码实现)——创建型模式
Singleton单例模式(Java代码实现)——创建型模式
172 0
|
8天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
10天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。