单利模式(饿汉模式,懒汉模式)线程安全与解决问题

单例模式

1.饿汉模式:在类被加载的时候创建实例(线程安全的)

2.懒汉模式:在方法被运行的时候创建实例(线程不安全的) 解决方法:通过双检验

饿汉模式:

public class Singleton {
    //饿汉模式
    //将构造函数私有化
    private Singleton(){

    }
    //将对象实例化
    private static Singleton instance = new Singleton();

    //得到实例的方法

    public static Singleton getInstance() {
        return instance;
    }
}

懒汉模式:

//懒汉模式
    //将构造函数私有化
    private Singleton(){

    }
    //将对象实例化
    private static Singleton instance ;

    //得到实例的方法

    public static Singleton getInstance() {
       if(instance == null){
           instance = new Singleton();
       }
        return instance;
    }

解决方法1(慢)

//得到实例的方法

    synchronized public static Singleton getInstance() {
       if(instance == null){
           instance = new Singleton();
       }
        return instance;
    }

解决方法2(慢)

 //得到实例的方法

     public static Singleton getInstance() {
      synchronized (Singleton.class){
          if(instance == null){
              instance = new Singleton();
          }
          return instance;
      }
    }

解决方法3(推荐)

原因:如果实例已经存在,就不存在线程安全的问题,可以直接获取实例,减少了加锁而造成的速度问题。

public class Singleton {
    //懒汉模式
    //将构造函数私有化
    private Singleton(){

    }
    //将对象实例化
    private static volatile  Singleton instance ;

    //得到实例的方法

     public static Singleton getInstance() {
         if(instance == null) {
             synchronized (Singleton.class) {
                 if (instance == null) {
                     instance = new Singleton();
                 }
             }
         }
         return instance;
    }
}

volatile 关键字

原文地址:https://www.cnblogs.com/da-peng/p/8278714.html

时间: 2024-10-08 16:43:54

单利模式(饿汉模式,懒汉模式)线程安全与解决问题的相关文章

[Js-设计模式]单例模式(饿汉,懒汉,登记式)

·单例模式的特点: 1. 单例类只能有一个实例. 2. 单例类必须自己创建自己的唯一实例. 3. 单例类必须给所有其他对象提供这一实例. ·各种单例模式的特点: ·懒汉式是延时加载,在需要的时候才创建对象,避免内存浪费,但存在线程安全问题. ·饿汉式线程安全,类一加载就实例化对象,所以要提前占用系统资源. ·登记式单例模式克服了饿汉以及懒汉单例的不可继承问题,其子类在登记时才被创建,并且子类的实例化方式只能是饿汉式. ·各种单例模式的类图: ·饿汉式单例模式 ·懒汉式单例模式: ·登记式单例模式

单例模式[ 懒汉模式 | 饿汉模式 ]

程序开发中,有些对象只需要一个,比如 配置文件/ 工具类/ 线程池/ 缓存/ 日志对象等.只需要一个单例模式: 可以保证某些对象在程序运行中只有唯一的一个实例.显然单例模式的要点有三个:一是某个类只能有一个实例:二是它必须自行创建这个实例:三是它必须自行向整个系统提供这个实例. 具体实现角度来说:one:单例模式的类只提供私有的构造函数,two:类定义中含有一个该类的静态私有对象,thr:该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象 单例模式:应用场合: 有些类的对象只需要一

单例模式--饿汉、懒汉、多线程以及多线程下改进

代码注释有介绍 package singleton; /** * @author: ycz * @date: 2018/12/24 0024 22:15 * @description: 懒汉模式 */ public class SingleTon1 { public SingleTon1(){} private static SingleTon1 instance1 = null; public static SingleTon1 getInstance1(){ if (instance1==n

多线程单例 可以概括为两中模式(饿汉模式和懒汉模式)

如何保证多线程下的单例. 1多线程安全单例模式一(不使用同步锁). 1 1 public class Singleton { 2 2 private Singleton() 3 3 {} 4 4 private static Singleton singleton; 5 5 6 6 public static Singleton getInstance() 7 7 { 8 8 if(singleton ==null) 9 9 { 10 10 singleton =new Singleton();

详解懒汉模式和饿汉模式以及他们的改进

提到单例模式的话相信很多人都不会陌生,一般初级程序员也知道懒汉模式和饿汉模式. 那么什么是单例模式呢?我个人低的理解就是当用这个类的对象的时候就只能创建同一个对象.是你,是你,还是你! 而在单例模式中又经常是懒汉和恶汉式进行加载.并没有痴汉也没有电车...我什么都不知道. 什么是饿汉模式呢?很饥饿,你想想,当人很饥饿时候是不是就有什么吃什么,那就是这个道理,所以就已加载类就创建对象.就好像当刚建好一个房子.主人就 搬了进去也不等装修. 那么她的代码是怎么实现的呢? 这就是饿汉模式.但是这个有一个

单例模式中的饿汉模式和懒汉模式【一看就懂】

以Java为例: 饿汉: public final class VirtualCore { private static VirtualCore gCore = new VirtualCore(); private VirtualCore() { } public static VirtualCore get() { return gCore; } } 懒汉: public final class VirtualCore { private static VirtualCore gCore =

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

1 教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法也返回单例类唯一的实例. 上代码: class singleton { protected: singleton(){} private: static singleton* p; public: static singleton* instance()

单例模式(懒汉式单例、饿汉式单例、登记式单例)

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象. 注意: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 介绍 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点.

单例模式(饿汉式单例模式与懒汉式单例模式)

首先弄清楚什么是单例模式? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案 单例模式的特点:(单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例) 1.该类只能有一个实例 2.该类只能自己创建这个唯一实例,且别人对该类无法创建实例 3.该类提供一个公开的方法public