/*单例模式:
 指某个类中只能存在一个对象实例,并且该类中只提供一个取得其对象实例的方法
 优点:减少系统性能开销
 应用场景:网站的计数器,任务管理器,回收站等
*/
 
//单例模式1 -- 静态内部类
//优点:线程安全,调用效率高,同时实现了延时加载
public class Singleton1 {
 //私有化构造器
 private Singleton1(){
  
 }
 //私有化静态内部类,并创建一个静态内部类变量
 private static class SingletonClassInstance{
  private static final Singleton1 instance = new Singleton1();
 }
 //定义公共的静态的方法,返回当前类的对象
 public static Singleton1 getInstance(){
  return SingletonClassInstance.instance;
 }
}
//单例模式2--懒汉式
//好处-- 延时加载,节省内存空间
//坏处 -- 线程不安全
class Singleton2 {
 //私有化构造器
 private Singleton2(){
  
 }
 //私有化对象
 private static Singleton2 instance;
 //获取对象
 public static Singleton2 getInstance(){
  if(instance == null){
   instance = new Singleton2();
  }
  return instance;
 }
}
//单例模式3 -- 饿汉式
//优点 -- 线程安全
//缺点 -- 没有延时加载,类加载之后会占用内存空间
class Singleton3{
 //私有化构造器
 private Singleton3(){
  
 }
 //私有化一个不可变对象
 private static final Singleton3 instance = new Singleton3();
 //获取对象
 public static Singleton3 getInstance(){
  return instance;
 }
}
//单例模式4 -- 枚举
//优点 -- 类初始化时就加载这个对象,线程安全.方法没有同步,调用效率高。避免了反射和反序列化的漏洞
//缺点 -- 没有延时加载
enum Singleton4{
 //定义一个枚举对象
 INSTANCE;
 //定义需要的方法
 public void singletonOperation(){
 }
}
//单例模式5 -- 双重检查锁式
//优点 -- 将同步内容下放到if内部,提高了执行效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了
//缺点 -- 由于编译器优化原因和JVM底层内部模型的原因,偶尔会出问题,不建议使用
class Singleton5{
 private Singleton5(){
  
 }
 private static Singleton5 instance = null;
 
 public static Singleton5 getInstance(){
  if(instance == null){
   Singleton5 sc;
   synchronized ( Singleton5.class){
    sc = instance;
    if(sc == null){
     synchronized(Singleton5.class){
      if(sc == null){
       sc = new Singleton5();
      } 
      
     }
     instance = sc;
    }
   }
  }
  return instance;
 }
 
}

Java 5种单例模式的更多相关文章

  1. Java几种单例模式的实现与利弊

    饿汉式 提前new出来实例了,并不是在第一次调用get方法时才实例化,没有进行延迟加载 public class Singleton1 { private static Singleton1 inst ...

  2. Java中的五种单例模式实现方法

    [代码] Java中的五种单例模式实现方法   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2 ...

  3. Java中的五种单例模式

    Java模式之单例模式: 单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例. 特点: 1,一个类只能有一个实例 2 自己创建这个实例 3 整个系统都要使用这个实例 例: 在下面 ...

  4. Java设计模式之单例模式(七种写法)

    Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ...

  5. java中的几种单例模式

    目前比较常见的有4种(DCL为懒汉模式的线程安全版本). 单例模式的实现一般需要满足以下条件: 1.构造方法私有化,实例属性私有化. 2.必须仅在类的内部完成实例的初始化过程. 3.提供公共静态方法, ...

  6. Core Java之7种单例模式

    初始化空 初始化创建 一把锁 两把锁 大专栏  Core Java之7种单例模式"headerlink" title="静态内部类">静态内部类 静态加载 ...

  7. 7、java实现的两种单例模式

    /* 两种单例模式的演示 */ //饿汉式 class Signal { private Signal(){} private Signal s = new Signal(); public stat ...

  8. java设计模式- (1)单例模式

    参加校园招聘的笔试,发现公司都会考一些java设计模式,所以上网查询相关内容,总结常用的几种单例模式. 单例模式(Singleton Pattern)是 Java中最简单的设计模式之一.这种类型的设计 ...

  9. Java中的单例模式

    单例模式: public class Person{ public static Person per; //定义一个静态变量,用来存储当前类的对象 private Person() //构造一个私有 ...

随机推荐

  1. mysql分批导出数据和分批导入数据库

    mysql分批导出数据和分批导入数据库 由于某些原因,比如说测试环境有很多库,需要迁移到新的环境中,不需要导出系统库的数据.而数据库又有好多,如何才能将每个库导出到独立的文件中呢?导入到一个文件的话, ...

  2. 数据库基本概念及Oracle基本语句

    一.数据库分类 通常是按照数据模型的特点将传统数据库系统分成网状数据库.层次数据库和关系数据库三种. 1.网状数据库 顾名思义,网状数据库采用的是以记录类型为结点的网状数据模型,是一种导航式(Navi ...

  3. 对DOMContentLoaded的研究 -----------------------引用

    1.    什么是 DOMContentLoaded.打开 Chrome DevTools,切到 Network 面板,重新加载网页,得到如下截图: 标记 1 指向的蓝线以及标记 2 指向的蓝色字 “ ...

  4. 解决谷歌浏览器给输入框input自动填充密码问题

    这时候我们可能会在 input上 加上 autocompleted="off" 这个属性来阻止input被自动填充. <input type="text" ...

  5. Linux 环境下 jar 加解密命令?

    1.源码打jar包 jar -cvf demo-source.jar -C src/ . > log.txt 2.编译字节打jar包 jar -cvf demo-class.jar -C bin ...

  6. 微信点餐系统(七)-微信授权获取openid:

    章节小结: 1.学会了微信授权的步骤,学会了微信授权的文档 2.学会了使用natapp内网穿透工具 3.加深了虚拟机的网络配置以及基本使用 4.学会了抓包购票工具fiddler的使用 5.微信授权步骤 ...

  7. 珍珠x

    题目描述 有n颗形状和大小都一致的珍珠,它们的重量都不相同.n为整数,所有的珍珠从1到n编号.你的任务是发现哪颗珍珠的重量刚好处于正中间,即在所有珍珠的重量中,该珍珠的重量列(n+1)/2位.下面给出 ...

  8. ROI pooling

    R-CNN需要大量的候选框,对每个候选框都提取特征,速度很慢,无法做到实时检测,无法做到端到端.ROI pooling层实现training和testing的显著加速,并提高检测accuracy. R ...

  9. (66)Nginx+lua+Redis开发

    一. 概述 Nginx是一个高性能,支持高并发的,轻量级的web服务器.目前,Apache依然web服务器中的老大,但是在全球前1000大的web服务器中,Nginx的份额为22.4%.Nginx采用 ...

  10. 接口自动化request库入门

    requests库7个主要方法 r= requsts.get(),主要属性: r.raise_for_status()方法内部判断r.status_code是否等于200不需要增加额外的if语句,该语 ...