单例模式之懒汉的并发问题

一个java小生的奋斗史 一个java小生的奋斗史     2022-08-07     444

关键词:

饿汉模式:

class Single{

  private staitc final Single s= new Single();

  private Single(){}

  public static Single getSingle(){

    return s;

  }

}  

懒汉模式:

class Single{

  private static Single s= null;

  private Single(){}

  public static Single getSingle(){

    if(s == null){

        -->A线程

        -->B线程

      s  =  new Single();

      return s;

    }  

  }

}  

在这里使用懒汉模式有一个安全性问题:

就是s为共享数据,可能会并发的访问getSingle()方法。当多线程访问时,一个A线程进来后,可能调用了sleep()方法在这里沉睡;一个B线程也可能在沉睡,当A线程醒来后,就会new一个对象,B线程醒来也会new一个对象;这样就不符合我们单例模式的特点了。

解决方案:在getSingle()方法前增加synchronized进行同步

另一个问题,当加了synchronized后,那么很多线程来访问时,都要判断一下锁是哪个,这就造成速率下降,解决方案如下:

public staitc Single getSingle(){

  if(s == null){

    synchronized(Single.class){  -->B线程,等着A解锁才让进去

      if(s == null){

          -->A线程

        s = new Single();

      }

    }

  return s;

  }

}

思路:

当s == null时,A线程进来了,他加了一下锁后进入第二个if(s ==null){},然后沉睡;此时,B也通过了第一个if(s == null),当B玩下执行时,遇到了synchronized(),发现这里A进行了加锁,没办法B线程只能等着,等A把锁解了。此时,A线程醒来了,它new 了一个对象后,继续玩下执行,然后把锁解了,这是s不等于null了。B发现A解锁了,它继续往下执行,发现s不等于null了,那它直接返回了A创建的那个对象s。当c线程访问getSingle方法时,只需判断s是否为null,而不用去判断锁对象了。因为s不等于null了,所以直接返回对象,这样就提高了效率

懒汉模式是延迟加载的实例,面对多线程访问时,需要进行同步代码块,为了增加效率,又要使用双重判断

注意:非静态的同步函数对象是this,静态的同步函数对象是:字节码对象。即类.class;

设计模式之单例模式分析

单例模式分为两大类:懒汉式和饿汉式其最主要的区别在于:懒汉式:指全局的单例实例在第一次被使用时构建饿汉式:指全局的单例实例在类装载时构建日常我们使用的最多也是懒汉式,懒汉式是按需加载,能够做到资源的最... 查看详情

单例模式之懒汉模式,懒汉模式之高效模式,dlc双判断模式

importjava.util.concurrent.LinkedBlockingQueue;importjava.util.concurrent.ThreadPoolExecutor;importjava.util.concurrent.TimeUnit;/***单例模式之懒汉模式*懒汉模式之高效模式*DLC双判断模式*/publicclassSingleClassLazySyncprivat 查看详情

设计模式之单例模式--懒汉模式与饿汉模式(代码片段)

上一章讲了单例模式的基本实现方式,但是在多线程环境下,这种方式是存在严重的问题的。所以本章我们就来解决多线程环境的问题。懒汉模式利用方法锁实现一种方式是在获取实例的方法上加锁//代码清单1publicclassLaz... 查看详情

并发编程之单例模式,volatile和synchronized

单例模式单例模式是众多设计模式中,可以说是最熟悉的了,但是由于单例模式的特殊性,我们需要在任何环境下,获取到的都是同一个实例,下面我们来看看。首先,单例类有一下几个特点。私有化的构造函数(防止外部自行... 查看详情

单例模式之懒汉式

??//单例模式之懒汉式classSingleton{privatestaticSingletoninstance=null;privateSingleton(){}publicstaticSingletongetSingleton(){if(instance==null){//同步代码块,保证安全性synchronized(Singleton.class){if(instance==null){ 查看详情

设计模式之单例模式(通俗易懂,超详细)

先上总结:单例模式就是在内存中只会创建且仅创建一次对象的设计模式,因为只创建一次对象,所以构造方法私有化,通过getInstence方法获取对象。单例模式分为懒汉式和饿汉式,懒汉式是在调用时创建对象,需要注意线程安... 查看详情

多线程单例模式之延迟加载(懒汉模式)

packagecom.wz.thread.delay;/** *延迟加载/懒汉模式单例设计模式 *使用DCL双检查锁机制,DCL是大多数多线程结合单例模式使用哪个的解决方案 *@authorAdministrator * */publicclassMyObject{      privat 查看详情

java设计模式之单例模式_懒汉式

单例模式 初识:单例模式(SingletonPattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有... 查看详情

java设计模式之单例模式

前言java最常见的设计模式就是单例模式,而单例模式最常见的就是懒汉式和饿汉式,现在就分别看一下 1.懒汉式懒汉式比较懒,当别人用到时才会初始化实例,而当有多个人同时用到就可能产生多个实例,造成线程安全问题... 查看详情

单例设计模式之懒汉式(枚举实现)(代码片段)

...e.hashCode());System.out.println(instance1.hashCode());//使用枚举实现单例设计模式//优点:使用JDK1.5提供的枚举来实现单例设计模式,不仅能避免多线程同步问题,而且还能防止反序列化创建新的对象,这种方式是Effectivejava中提倡的方式enu... 查看详情

设计模式之单例模式(懒汉,饿汉)(代码片段)

文章目录一.单例模式概述二.单例模式的实现1.饿汉模式2.懒汉模式一.单例模式概述单例模式是一种常用的软件设计模式,该模式的主要目的是确保某一个类在内存中只能有一个实例对象,通过单例模式的方法创建的类在当前进程中... 查看详情

设计模式之单例模式(代码片段)

设计模式-单例模式在Java设计模式中,单例模式相对来说算是比较简单的一种构建模式。适用的场景在于:对于定义的一个类,在整个应用程序执行期间只有唯一的一个实例对象。主要实现方式包括饿汉式、懒汉式;懒汉式需要... 查看详情

单例设计模式(懒汉式饿汉式)(代码片段)

单例模式饿汉式classSingleton/***单例模式---饿汉式*/privatestaticfinalSingletons=newSingleton();privateSingleton()publicstaticSingletongetInstance()returns;懒汉式classSingletonLazy/***单例模式---懒汉式*/privatestaticSingletonLazys;privateSingletonLazy()/***解决并发线程... 查看详情

设计模式之单例模式

单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。2、省去了... 查看详情

单例设计模式之懒汉式(代码片段)

classSingletonprivatestaticSingletoninstance=null;privateSingleton()publicstaticSingletongetInstance()if(instance==null)synchronized(Singleton.class)if(instance==null)instance=newSingleton(); 查看详情

(android开发)关于懒汉模式的并发问题以及规避方法

...oid项目。而在Android项目以及搭建通用框架的过程中,单例模式的使用是少不了的。对于单例模式,我个人的理解就是需要使用的这个类时候,只能够创建同一个对象。那在单例模式中其实又可以分为两种比较基础的... 查看详情

单例模式之单例模式(代码片段)

单例模式创建方式有以下几种方式:饿汉模式懒汉模式注册式模式枚举式模式序列化模式 1.饿汉模式在类加载时初始化,也是利用类加载线程安全的特性确保了单例实例化的线程安全。packagecom.kancy.pattern.single;/***单例模式-饿... 查看详情

单例模式之个人笔记

概念理解:关于单例模式,顾名思义,就是单一的实例,也就是说,实例只有一个。比如一个公司只有一辆公家车,你出门开这辆车,别人出门也开这辆车,你们每次开的其实是同一辆车,车只有一辆,对应java就是,我调用的... 查看详情