转载博主:thankyou

https://blog.csdn.net/twj13162380953/article/details/53869983

理解:

饿汉式获取实例的步骤简单所以线程更安全。懒汉式只是不会在类加载时即创建静态对象而效率略高,而因此也导致有判断是否已创建对象环节会使线程变得不安全,需要加同步锁才能解决该问题。

单例模式

解决的问题:保证一个类在内存中的对象唯一性.

比如:多程序读取一个配置文件时,建议配置文件封装成对象。会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,

就需要该配置文件对象在内存中是唯一的。

如何保证对象唯一性呢?
思想:
1,不让其他程序创建该类对象。
2,在本类中创建一个本类对象。
3,对外提供方法,让其他程序获取这个对象。

步骤:
1,因为创建对象都需要构造函数初始化,只要将本类中的构造函数私有化,其他程序就无法再创建该类对象;
2,就在类中创建一个私有并静态的本类的对象;
3,定义一个方法,返回该对象,让其他程序可以通过方法就得到本类对象。(作用:可控)

代码体现:
1,私有化构造函数;
2,创建私有并静态的本类对象;
3,定义公有并静态的方法,返回该对象。

饿汉模式:

  1.  
    class Single{
  2.  
    private Single(){} //私有化构造函数。
  3.  
    private static Single s = new Single(); //创建私有并静态的本类对象。
  4.  
    public static Single getInstance(){ //定义公有并静态的方法,返回该对象。
  5.  
    return s;
  6.  
    }
  7.  
    }

//懒汉式:延迟加载方式。使用到的时候才回去初始化该对象

  1.  
    class Single2{
  2.  
    private Single2(){}
  3.  
    private static Single2 s = null;
  4.  
    public static Single2 getInstance(){
  5.  
    if(s==null)
  6.  
    s = new Single2();
  7.  
    return s;
  8.  
    }
  9.  
    }

在多线程模式中,考虑到性能和线程安全问题,我们一般会选择下面两种比较经典的单例模式,在性能提高的同时,又保证了线程的安全.

1.static inner Class

2.dubble check instance

(饿汉模式)static inner Class-内部静态类的形式

  1.  
    public class Singletion {
  2.  
     
  3.  
    private static class InnerSingletion {
  4.  
    private static Singletion single = new Singletion();
  5.  
    }
  6.  
     
  7.  
    public static Singletion getInstance(){
  8.  
    return InnerSingletion.single;
  9.  
    }
  10.  
     
  11.  
    }

(懒汉模式) dubble check instance-为确保线程安全,需要两次check

  1.  
    public class DubbleSingleton {
  2.  
     
  3.  
    private static DubbleSingleton ds;
  4.  
     
  5.  
    public static DubbleSingleton getDs(){
  6.  
    if(ds == null){
  7.  
    try {
  8.  
    //模拟初始化对象的准备时间...
  9.  
    Thread.sleep(3000);
  10.  
    } catch (InterruptedException e) {
  11.  
    e.printStackTrace();
  12.  
    }
  13.  
    synchronized (DubbleSingleton.class) {
  14.  
    if(ds == null){
  15.  
    ds = new DubbleSingleton();
  16.  
    }
  17.  
    }
  18.  
    }
  19.  
    return ds;
  20.  
    }
  21.  
     
  22.  
    public static void main(String[] args) {
  23.  
    Thread t1 = new Thread(new Runnable() {
  24.  
    @Override
  25.  
    public void run() {
  26.  
    System.out.println(DubbleSingleton.getDs().hashCode());
  27.  
    }
  28.  
    },"t1");
  29.  
    Thread t2 = new Thread(new Runnable() {
  30.  
    @Override
  31.  
    public void run() {
  32.  
    System.out.println(DubbleSingleton.getDs().hashCode());
  33.  
    }
  34.  
    },"t2");
  35.  
    Thread t3 = new Thread(new Runnable() {
  36.  
    @Override
  37.  
    public void run() {
  38.  
    System.out.println(DubbleSingleton.getDs().hashCode());
  39.  
    }
  40.  
    },"t3");
  41.  
     
  42.  
    t1.start();
  43.  
    t2.start();
  44.  
    t3.start();
  45.  
    }
  46.  
     
  47.  
    }

输出结果:

    1.  
      792363696
    2.  
      792363696
    3.  
      792363696

java 单例模式之线程安全的饿汉模式和懒汉模式的更多相关文章

  1. Java-设计模式-单例模式-饿汉模式、懒汉模式

    //-------------------------------------------------------------饿汉模式--开始----------------------------- ...

  2. Java单例模式之饿汉模式与懒汉模式

    单例模式是我们在开发软件的过程中经常用到的23中常用的java模式之一,主要的功能就是保证我们所使用的对象只有一个,这也在一方面减少了出错的可能性,增强了代码的健壮.单例模式一般来说有两种实现的方式, ...

  3. 设计模式-单例模式(Singleton Pattren)(饿汉模式和懒汉模式)

    单例模式(Singleton Pattren):确保一个类在整个应用中只有一个实例,并提供一个全局访问点. 实现要点: 1. 私有化构造方法 2. 类的实例在类初始化的时候创建 3. 提供一个类方法, ...

  4. Java单例模式的线程安全问题

    单例模式有两种书写模式:饿汉式和懒汉式. 1.饿汉式 class Single{ private final static Single s = new Single(); private Singl ...

  5. 单例模式之懒汉模式,懒汉模式之高效模式,DLC双判断模式

    import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; imp ...

  6. java单例模式(线程安全,效率高,双重推断)

    这样的方法,在获取单利的时候,避免了线程锁,导致訪问该方法速度非常慢, 同是,防止了多线程同事房屋该方法就会产生多个实例的问题. 效率高.线程安全. public class TestInstance ...

  7. Java设计模式 - 单例模式 (懒汉方式和饿汉方式)

    概念: Java中单例模式是一种常见的设计模式,单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的写法有好几种,这 ...

  8. java中的单例模式(懒汉式+饿汉式)

    什么是单例模式: 单例模式既只能在自己本类中创建有且唯一的一个实例(姑且不考虑映射的情况)通过方法将该实例对外公开 第一种:单例模式-懒汉式 既调用getInstance()方法返回实例之前判断有没有 ...

  9. C++的单例模式与线程安全单例模式(懒汉/饿汉)

    1 教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实 ...

随机推荐

  1. ACM学习历程—Hihocoder 1289 403 Forbidden(字典树 || (离线 && 排序 && 染色))

    http://hihocoder.com/problemset/problem/1289 这题是这次微软笔试的第二题,过的人比第三题少一点,这题一眼看过去就是字符串匹配问题,应该可以使用字典树解决.不 ...

  2. Operating System-Process(1)什么是进程&&进程的创建(Creation)&&进程的终止(Termination)&&进程的状态(State)

    本文阐述操作系统的核心概念之一:进程(Process),主要内容: 什么是进程 进程的创建(Creation) 进程的终止(Termination) 进程的状态(State) 一.什么是进程 1.1 ...

  3. MySQL查询计划输出列的含义

    "一:MySQL查询计划输出列的含义:1.id:每个被独立执行的操作的标识,表示对象被操作的顺序:id值越大,先被执行:如果相同,执行顺序从上到下.2.select_type:查询中每个se ...

  4. CCS V5 使用教程一: 安装激活与创建工程

    CCS下载与安装 下载地址 Liscense下载地址 安装教程 创建工程 工程创建教程

  5. AD9 如何画4层pcb板

    新建的PCB文件默认的是2层板,教你怎么设置4层甚至更多层板. 在工具栏点击Design-->Layer Stack Manager.进入之后显示的是两层板,添加为4层板,一般是先点top la ...

  6. mariadb的读写分离

    实验环境:CentOS7 设备:一台主数据库服务器,两台从数据库服务器,一台调度器 主从的数据库配置请查阅:http://www.cnblogs.com/wzhuo/p/7171757.html : ...

  7. js点滴知识(1) -- 获取DOM对象和编码

    在今天的工作中发现了一些小的问题,在网上查了一下,才知道自己的js才是冰山一角,以后要虚心向他人学习,要虚怀若谷. 发现一:js获取DOM对象与jquery的区别 先前总以为,二者是一样的,最近才知道 ...

  8. SpringMvc之参数绑定注解详解之一

    引言: 前段时间项目中用到了REST风格来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加 任何注解),查看了提交方式为application/ ...

  9. Flask13 面试要能吹 、安装虚拟机、虚拟机全局设置、导入虚拟机文件、虚拟机局部设置

    1 web开发工作的三个能力 1.1 开发思想 易维护:开发成本远低于维护成本 可扩展:随着访问量的增加会自动使用多个数据库 高可用:程序就像小强一样,开发的系统能够经得住狂风暴雨的吹残(例如:一台主 ...

  10. Linux下查看CPU使用率 --- top命令的使用

    在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况.运行 top 命令后,CPU 使用状态会 ...