转载博主: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. bzoj 1023 [SHOI2008]cactus仙人掌图 ( poj 3567 Cactus Reloaded )——仙人掌直径模板

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1023 http://poj.org/problem?id=3567 因为lyd在讲课,所以有 ...

  2. 用Fiddler2来监听HTTP(记:用skydrive sdk访问时,出错后用Fidder抓包分析)

    最近在写一个关于如何上传文件到skydrive的demo, 用REST上传失败. 安装Telerik的Fiddler后, 可以监听http或者https通信, 然后可以在软件中看到返回的json数据或 ...

  3. RabbitMQ队列,Redis\Memcached缓存

    RabbitMQ RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统. MQ全称Message Queue,消息队列(MQ)是一种应用程序对应用程序的通信方式.应用程序通过读写出入队列 ...

  4. DNS Doctoring

    NAT的应用可以让路由器在不同地址域内路由数据包.一个暴露在外的应用服务器,通常同时拥有了内网和外网的IP地址.这在DNS解析时可能带来麻烦. 根据DNS服务器的部署位置和配置,对同一内网中的应用服务 ...

  5. uboot启动参数设置分类及方法

    一.nfs启动内核与根文件系统,内核与根文件系统都在nfs上 bootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.0.1:/home/tekkaman ...

  6. Command line option syntax error. Type Command /? for Help.

    --------------------------- Microsoft Visual C++ 2005 Redistributable --------------------------- Co ...

  7. 10、RNA-seq for DE analysis training(Mapping to assign reads to genes)

    1.Goal of mapping 1)We want to assign reads to genes they were derived from 2)The result of the mapp ...

  8. tensorflow第一个例子

    import tensorflow as tf import numpy as np # create data x_data = np.random.rand(100).astype(np.floa ...

  9. 6.1 安装Ubuntu

    声明:sunny从来没有接触过linux.今天是第一次接触linux,日后每天都会接触linux了.坚持,每日练习,相信毕业后的我,一定会从小白成为linux大神. 安装Ubuntu之前,请先参考该博 ...

  10. sublime插件-OmniMarkupPreviewer浏览器打开报404解决办法

    Sublime Text > Preferences > Package Settings > OmniMarkupPreviewer > Settings - Default ...