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>

目录
相关文章
|
3天前
|
安全 Java 调度
Java线程:深入理解与实战应用
Java线程:深入理解与实战应用
20 0
|
1天前
|
消息中间件 缓存 NoSQL
Java多线程实战-CompletableFuture异步编程优化查询接口响应速度
Java多线程实战-CompletableFuture异步编程优化查询接口响应速度
|
1天前
|
数据采集 存储 Java
高德地图爬虫实践:Java多线程并发处理策略
高德地图爬虫实践:Java多线程并发处理策略
|
2天前
|
缓存 Java
【Java基础】简说多线程(上)
【Java基础】简说多线程(上)
6 0
|
2天前
|
并行计算 算法 安全
Java从入门到精通:2.1.3深入学习Java核心技术——掌握Java多线程编程
Java从入门到精通:2.1.3深入学习Java核心技术——掌握Java多线程编程
|
2天前
|
安全 Java 编译器
是时候来唠一唠synchronized关键字了,Java多线程的必问考点!
本文简要介绍了Java中的`synchronized`关键字,它是用于保证多线程环境下的同步,解决原子性、可见性和顺序性问题。从JDK1.6开始,synchronized进行了优化,性能得到提升,现在仍可在项目中使用。synchronized有三种用法:修饰实例方法、静态方法和代码块。文章还讨论了synchronized修饰代码块的锁对象、静态与非静态方法调用的互斥性,以及构造方法不能被同步修饰。此外,通过反汇编展示了`synchronized`在方法和代码块上的底层实现,涉及ObjectMonitor和monitorenter/monitorexit指令。
15 0
|
2天前
|
监控 安全 Java
在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!
在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!
10 2
|
2天前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
28 1
|
2天前
|
安全 Java
Java基础教程(15)-多线程基础
【4月更文挑战第15天】Java内置多线程支持,通过Thread类或Runnable接口实现。线程状态包括New、Runnable、Blocked、Waiting、Timed Waiting和Terminated。启动线程调用start(),中断线程用interrupt(),同步用synchronized关键字。线程安全包如java.util.concurrent提供并发集合和原子操作。线程池如ExecutorService简化任务管理,Callable接口允许返回值,Future配合获取异步结果。Java 8引入CompletableFuture支持回调。
|
3天前
|
Java
Java中的并发编程:理解和应用线程池
【4月更文挑战第23天】在现代的Java应用程序中,性能和资源的有效利用已经成为了一个重要的考量因素。并发编程是提高应用程序性能的关键手段之一,而线程池则是实现高效并发的重要工具。本文将深入探讨Java中的线程池,包括其基本原理、优势、以及如何在实际开发中有效地使用线程池。我们将通过实例和代码片段,帮助读者理解线程池的概念,并学习如何在Java应用中合理地使用线程池。