java----单列模式

简介: 要点:1,某个类只能有一个实例2,必须自行创建实例3,必须自行向整个系统提供这个实例。

实现

1,只提供私有的构造方法

2,含有一个该类的静态私有对象

3,提供一个静态的共有方法用于创建,获取静态私有对象。

代码实现方案

1,饿汉式--对象创建过程中实例化

2,懒汉式--静态共有方法中实例化,用到的时候才进行实例化操作。

单例模式的实现必须满足(ACD)个条件。(选择三项)

A类中的构造方法的访问权限必须设置为私有的

B类中的构造方法必须用protected修饰

C必须在类中创建该类的静态私有对象

D在类中提供一个公有的静态方法用于创建、获取静态私有对象

饿汉式:特点,创建对象实例的时候直接初始化。

image.gif

class SingletonOne {
   // 1
创建类中私有构造
   private SingletonOne() {
   }//
外部不能创建该实例

// 2创建该类型的私有静态实例
   private static SingletonOne instance = new SingletonOne();

// 3创建共有静态方法,返回静态实例对象。
   public static SingletonOne getInstance() {
       return instance;
   }

}

public class Re {

   public static void main(String[] args) {

       SingletonOne one = SingletonOne.getInstance();

       SingletonOne two = SingletonOne.getInstance();

System.out.println(one);
      System.out.println(two);
       //
验证结果,两个对象的应用表示相同,验证成功。
       //
空间换时间。
   }
}

image.gif

 

编程练习

某公司研发星球维护系统,请使用饿汉式单例模式的实现思想,设计编写地球类。

程序运行参考效果图如下:

image.png

 

 

任务

实现步骤:

Earth类

定义私有构造方法,并在构造方法中打印输出“地球诞生”

结合饿汉模式,完成单例对象定义,实例化及静态方法设置

测试类

结合已有输出提示、运行效果图完成对象实例创建及对比(具体对象引用信息不限)

image.gif

public class Earth {
    //
定义私有构造方法,并在构造方法中打印输出地球诞生
   
    //
定义私有静态类对象并完成实例化
       
    //
定义公有静态方法返回类内的私有静态对象
   
}
public class Test {

public static void main(String[] args) {
       // TODO Auto-generated method stub
       System.out.println("
第一个地球创建中。。。。");
       
       System.out.println("
第二个地球创建中。。。。");
       
       System.out.println("
第三个地球创建中。。。。");
       
       System.out.println("
问:三个地球是同一个么?");
   }
}

image.gif

 

懒汉式:

image.gif

/**
*
懒汉式:类内实例对象创建时并不直接初始化,
*
直到第一次调用get方法时,才完成初始化操作。
*/
class SingletonTwo {
   // 1
创建类中私有构造
   private SingletonTwo() {}//
外部不能创建该实例

// 2创建该类型的私有静态实例
   private static SingletonTwo instance = null;

// 3创建共有静态方法,提供实例对象。
   public static SingletonTwo getInstance() {
       if(instance == null)
           instance = new SingletonTwo();
       return instance;
   }

}

public class Re {

   public static void main(String[] args) {

       SingletonTwo one = SingletonTwo.getInstance();

       SingletonTwo two = SingletonTwo.getInstance();

System.out.println(one);
      System.out.println(two);
       //
验证结果,两个对象的应用表示相同,验证成功。
       //
时间换空间。
   }
}

image.gif

 

3-4 编程练习

请使用懒汉式单例模式的实现思想,设计编写皇帝类。

程序运行参考效果图如下:

image.png

 

 

任务

实现步骤:

Emperor类

1、定义私有构造方法

2、结合懒汉模式,完成单例对象定义,实例化及静态方法设置

测试类

结合注释完成测试单例的皇帝类信息,程序效果参考运行效果图(具体对象引用信息不限)

image.gif

public class Emperor {
    //
定义私有构造方法

//定义私有静态类对象

//定义公有静态方法返回类内的私有静态对象
       
}

public class Test {

public static void main(String[] args) {
       System.out.println("
创建1号皇帝对象");
       
       System.out.println("
创建2号皇帝对象");
       
       System.out.println("
创建3号皇帝对象");
       
       System.out.println("
三个皇帝对象依次是:");
   }
}

image.gif

 

image.png

-------------------

饿汉式线程安全

懒汉式存在线程风险

 

来自 <https://www.cnblogs.com/haizinihao/p/14706415.html>

目录
相关文章
|
7天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
17天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
79 6
【Java学习】多线程&JUC万字超详解
|
3天前
|
Java
深入理解Java中的多线程编程
本文将探讨Java多线程编程的核心概念和技术,包括线程的创建与管理、同步机制以及并发工具类的应用。我们将通过实例分析,帮助读者更好地理解和应用Java多线程编程,提高程序的性能和响应能力。
15 4
|
11天前
|
Java 调度 开发者
Java并发编程:深入理解线程池
在Java的世界中,线程池是提升应用性能、实现高效并发处理的关键工具。本文将深入浅出地介绍线程池的核心概念、工作原理以及如何在实际应用中有效利用线程池来优化资源管理和任务调度。通过本文的学习,读者能够掌握线程池的基本使用技巧,并理解其背后的设计哲学。
|
2天前
|
安全 Java 调度
Java 并发编程中的线程安全和性能优化
本文将深入探讨Java并发编程中的关键概念,包括线程安全、同步机制以及性能优化。我们将从基础入手,逐步解析高级技术,并通过实例展示如何在实际开发中应用这些知识。阅读完本文后,读者将对如何在多线程环境中编写高效且安全的Java代码有一个全面的了解。
|
10天前
|
缓存 监控 Java
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
|
7天前
|
Java 调度 开发者
Java中的多线程基础及其应用
【9月更文挑战第13天】本文将深入探讨Java中的多线程概念,从基本理论到实际应用,带你一步步了解如何有效使用多线程来提升程序的性能。我们将通过实际代码示例,展示如何在Java中创建和管理线程,以及如何利用线程池优化资源管理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧,帮助你更好地理解和应用多线程编程。
|
12天前
|
缓存 监控 Java
java中线程池的使用
java中线程池的使用
|
12天前
|
算法 Java 数据处理
Java并发编程:解锁多线程的力量
在Java的世界里,掌握并发编程是提升应用性能和响应能力的关键。本文将深入浅出地探讨如何利用Java的多线程特性来优化程序执行效率,从基础的线程创建到高级的并发工具类使用,带领读者一步步解锁Java并发编程的奥秘。你将学习到如何避免常见的并发陷阱,并实际应用这些知识来解决现实世界的问题。让我们一起开启高效编码的旅程吧!
|
17天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。