热门课程

免费试听

上课方式

开班时间

当前位置: 首页 -   文章 -   新闻动态 -   正文

知了堂分享java四种单例模式

知了堂姐
2024-07-08 17:22:16
0

  单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。今天知了堂给大家分析java开发中四种单例模式:


      单例模式:


  目标:保证一个类只有一个实例;

  实现:不可被外部创建;

  限制外部访问方式;

  内部只创建一个唯一的实例;

  单例模式实现

  1.饿汉式

  /**
  * 饿汉式单例,创建类时创建单例,线程也不安全
  */
  public class SingletonHungary {
  private static final SingletonHungary instance = new SingletonHungary();
  private SingletonHungary(){}
  public static SingletonHungary getInstance() {
  return instance;
  }
  }


  特点:由内部直接创建资源,创建类时创建单例会浪费不必要的资源。

  2.懒汉式

  /**
  * 懒汉式单例,需要时创建单例(线程不安全版本)
  */
  public class SingletonLazy{
  private static SingletonLazy instance ;
  private SingletonLazy(){}
  public static SingletonLazy getInstance() {
  if(instance==null){
  instance=new SingletonLazy();
  }
  return instance;
  }
  }


  特点:为了避免懒汉式那样浪费资源,所以在需要的时候调用静态方法从而实例化对象。但是在特定时候两次及以上同时调用会产生死锁的情况,所以是线程不安全的。


知了堂分享java四种单例模式

  3.DCL

  package me.maiz.se.mini.deignpattern;
  /**
  * 懒汉式单例,需要时创建单例(线程安全版本,使用了双重检查锁DCL机制)
  */
  public class SingletonDoubleChecking {
  private static SingletonDoubleChecking instance ;
  private SingletonDoubleChecking(){}
  public static SingletonDoubleChecking getInstance() {
  //检查是否为空,不为空时不检查,节省性能消耗;为空时可能有并发问题
  if(instance==null){
  //同步代码块,保证不会被并发获取
  synchronized(SingletonDoubleChecking.class) {
  //进入时再次判断,若不为空则不建实例,保证单例
  if (instance==null) {
  instance = new SingletonDoubleChecking();
  }
  }
  }
  return instance;
  }
  }


  特点:为了线程安全首先想到的是在java中加 synchronized修饰,但是每一次使用的时候都去排队降低了效率。所以我们在还没有实例化对象的之前防止死锁,如果已经有一个实例就不用考虑同时创建而形成死锁了。

  4.枚举

  /**
  * 枚举式单例,枚举的创建由JVM保证,因此不会出现并发问题,构造器自动私有,外部不能创建,只能引用
  * 用法为:SingletonEnum.INSTANCE.doSomething();
  */
  public enum SingletonEnum {
  //唯一实例,默认为public static final的
  INSTANCE;
  public String name;
  public void doSomething(){
  System.out.println("doSomething");
  }
  public static void main(String[] args) {
  SingletonEnum.INSTANCE.doSomething();
  }
  }


  特点:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。

        版权声明:本文来源于网络,由知了堂搜集整理,更多Java编程学习可以访问视频课程栏目观看Java在线视频

大家都在看

渗透测试的基本流程:某网站的渗透测试过程记录

2024-07-08 浏览次数:0

Python 函数、高级语法和用法

2024-07-08 浏览次数:0

网络安全目前薪资是多少?成都网络安全工程师待遇

2024-07-08 浏览次数:0

内江师范学院计算机科学学院唐院长一行到我司考察

2024-07-08 浏览次数:0

高级渗透测试面试题及答案解析,祝你找到好工作

2024-07-08 浏览次数:0

jsp与html有什么区别和联系?静态与动态谁更...

2024-07-08 浏览次数:0
最新资讯