首页 > 编程语言 >java单例模式几种实现方式

java单例模式几种实现方式

时间:2023-06-02 21:05:57浏览次数:43  
标签:java 延时 private 几种 instance static 单例 public


1、饿汉式(线程安全,调用效率高,但是不能延时加载):

public class ImageLoader{ 
private static ImageLoader instance = new ImageLoader; 
private ImageLoader(){} 
public static ImageLoader getInstance(){  
return instance;  
} 
}

一上来就把单例对象创建出来了,要用的时候直接返回即可,这种可以说是单例模式中最简单的一种实现方式。但是问题也比较明显。单例在还没有使用到的时候,初始化就已经完成了。也就是说,如果程序从头到位都没用使用这个单例的话,单例的对象还是会创建。这就造成了不必要的资源浪费。所以不推荐这种实现方式。

 

2.懒汉式(线程安全,调用效率不高,但是能延时加载):

public class SingletonDemo2 {
     
    //类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)
    private static SingletonDemo2 instance;
     
    //构造器私有化
    private SingletonDemo2(){}
     
    //方法同步,调用效率低
    public static synchronized SingletonDemo2 getInstance(){
        if(instance==null){
            instance=new SingletonDemo2();
        }
        return instance;
    }
}

 

3.Double CheckLock实现单例:DCL也就是双重锁判断机制(由于JVM底层模型原因,偶尔会出问题,不建议使用):

 View Code

 

4.静态内部类实现模式(线程安全,调用效率高,可以延时加载)

1 public class SingletonDemo3 { 2      
 3     private static class SingletonClassInstance{
 4         private static final SingletonDemo3 instance=new SingletonDemo3();
 5     }
 6      
 7     private SingletonDemo3(){}
 8      
 9     public static SingletonDemo3 getInstance(){
10         return SingletonClassInstance.instance;
11     }
12      
13 }


 

5.枚举类(线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用)

1 public enum SingletonDemo4 {2      
3     //枚举元素本身就是单例
4     INSTANCE;
5      
6     //添加自己需要的操作
7     public void singletonOperation(){     
8     }
9 }

如何选用:

-单例对象 占用资源少,不需要延时加载,枚举 好于 饿汉

-单例对象 占用资源多,需要延时加载,静态内部类 好于 懒汉式

标签:java,延时,private,几种,instance,static,单例,public
From: https://blog.51cto.com/chengzheng183/6404866

相关文章

  • Java8 Lambda表达式
    学习资料:https://www.bilibili.com/video/BV1ci4y1g7qD/?spm_id_from=333.337.search-card.all.click&vd_source=46d50b5d646b50dcb2a208d3946b1598......
  • IDEA集成Java性能分析神器JProfiler
    阅读文本大概需要10分钟。《eclipse集成Java性能分析神器JProfiler》讲解了eclipse集成Jprofiler,这篇讲解一下IDEA如何集成JProfiler。1、在JProfiler中配置IDEA选择IDEA2019这里并不同于Eclipse选择Eclipse的安装目录。IDEA选择的是配置目录,啥为配置目录了呢?其实就是在配置JProfi......
  • Java队列Disruptor 的使用
    、什么是Disruptor 从功能上来看,Disruptor是实现了“队列”的功能,而且是一个有界队列。那么它的应用场景自然就是“生产者-消费者”模型的应用场合了。可以拿JDK的BlockingQueue做一个简单对比,以便更好地认识Disruptor是什么。我们知道BlockingQueue是一个FIFO队列,生......
  • 2014.4.19.12.27_switch_8.28_java switch语句使用注意的四大细节_0.01
    javaswitch语句使用注意的四大细节很多朋友在使用javaswitch语句时,可能没有注意到一些细节,本文将详细介绍使用javaswitch语句四大要点,需要的朋友可以参考下。switch语句的格式如下:(它的功能是选出一段代码执行)switch(整数选择因子){case整数值1:语句;break;case整数值......
  • 2015.4.21.09.05_多态_2015.4.21_深入理解java多态性_0.01
    深入理解Java多态性多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。多态有两种表现形式:重载和覆盖首先说重载(overload),是发生在同一类中。与什么父类......
  • JAVA Socket编程
    aliases:[]tags:""summary:[基于TCP/IP和UDP协议的JavaSocket网络通信编程]author:[yaenli]notekey:[20230512-143738]Socket网络模型Socket编程是在TCP/IP、UDP协议上的网络编程,在此之前,先了解下常见的网络模型:OSI七层模型与TCP模型:OSI七层模型详解(OSI......
  • 定时器(JavaScript)的使用
    前言通过定时器自动的做一些事情,例如发送网络请求一、定时器定时器:定时器可以设定时间自动的做某件事情。定时器是一种方法,不是对象,定时器属于window对象。二、定时器具体内容周期性定时器:间隔一定的时间,自动的做某件事情setInterval(函数名,间隔时间)一次性定时器:延迟多长时间做......
  • java 封装
    1.面向对象思想为什么使用面向对象使人和计算机的交流更加流畅;提高开发效率生活中/计算机描述对象对比生活中的对象定义:看的见摸得着的都是对象计算机中的对象的定义:1.类2.属性3.方法类图使用类图描述类:用于分析和设计类;直观,容易理解; ......
  • 搭建Java环境
    一、JDK的下载Java的JDK是Sun公司的产品。由于Sun公司已经被Oracle公司收购,因此JDK可以在Oracle的官方网站下载。下面介绍下载JDK的方法,具体步骤如下:(1)打开浏览器,输入如下网址:https://www.oracle.com/technetwork/java/javase/downloads/jdk13-downloads-5672538.html,或者点击此处......
  • java while 循环 打印1到5的值
    packagecom.fqs.test;importjava.util.Scanner;publicclasshello{publicstaticvoidmain(String[]args){//循环打印1到5inti=0;while(i<5){i++;System.out.print(i);}}} 先打印后......