设计模式-单例模式JAVA实现

单例模式其实是一种面向底层的开发模式,业务里能用到的环境不是很多。这里权且以项目启动时获取仓库信息做示例。

一,饿汉模式,在项目一启动的时候就将所需要的对象实例化出来。虽然传说中可能会占用内存不一定会用到,但实际上写一个不会被用到的例的可能性极小,不过不排除一些业务类可能会因为业务的变更迁移而被废掉,这么看来还是有些道理的。

饿汉式的单例模式是线程安全的,因为在发起多线程之前这个对象就已经存在了
package Singleton;

/**

  • 单例模式,饿汉式
  • @author [email protected]
  • */
    public class WmsSingleton {

    //只在这里创建一次,是线程安全的
    private static WmsSingleton singleton = new WmsSingleton();

    private WmsSingleton() {}

    public static WmsSingleton getInstance() {

    System.out.println("获取对象前对象信息:"+singleton);
    return singleton;
    }
    }

一般的懒汉式不一定线程安全,所谓的线程安全,简略来讲只要你要对类的静态常量有修改的动作,那就可能会涉及到非线程安全

package Singleton;

/**

  • 单例模式,懒汉式
  • @author [email protected]
  • */
    public class WmsLazySingleton {

    private static WmsLazySingleton singleton;

    private WmsLazySingleton() {}

    public static WmsLazySingleton getInstance() {

     if (singleton == null) {
         System.out.println("获取对象前对象信息:"+singleton);
         singleton = new WmsLazySingleton();
         System.out.println("获取对象后对象信息:"+singleton);
     }
     return singleton;

    }
    }

既然一般的懒汉式可能涉及到线程安全问题,那么可以考虑对相应的方法块加一下同步锁,来解决这个问题。这里同步锁锁定的对象一定不能是null

可以想象成你无法对一个虚空加锁,必须要有一个实体,锁才能起到作用
package Singleton;

/**

  • 单例模式,饱汉式+synchronized锁,保证线程安全
  • @author [email protected]
  • */
    public class WmsLazySyncSingleton {

    private static WmsLazySyncSingleton lazySyncSingleton = null;

    private static Object lock = new Object();

    private WmsLazySyncSingleton(){}

    public static WmsLazySyncSingleton getInstance(){

    //加同步锁
    synchronized(lock) {
    
        if (lazySyncSingleton == null) {
    
            lazySyncSingleton =  new WmsLazySyncSingleton();
        }
    }
    return lazySyncSingleton;

    }

}

以静态内部类的方式来实现懒汉式。这是基于JAVA加载静态内部类的时机来进行实现的
package Singleton;

/**

  • 静态内部类方式实现
  • @author [email protected]
  • */
    public class WmsStaticClassSingleton {

    //静态内部类初始化对象
    private static class StaticClassSingleton{

     private static WmsStaticClassSingleton staticClassSingleton = new WmsStaticClassSingleton();

    }

    private WmsStaticClassSingleton(){}

    public static WmsStaticClassSingleton getInstance(){
    return StaticClassSingleton.staticClassSingleton;
    }
    }

原文地址:https://blog.51cto.com/4890631/2485495

时间: 2024-08-20 23:22:06

设计模式-单例模式JAVA实现的相关文章

设计模式 -- 单例模式(Java&&PHP)

所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等. 能够想到的最简单的实现是,把类的构造函数写成private的,从而保证别的类不能实例化此类,然后在类中提供一个静态的实例并能够返回给使用者.这样,使用者就可以通过这个引用使用到这个类的实例了. 单例模式在这里介绍两种,一种是饿汉,一种是懒汉. 饿汉单例模式                        

Java设计模式の单例模式

-------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱汉式,非线程安全 c.饱汉式,线程安全简单实现 d.线程安全 并且效率高  单例模式最优方案 3.总结 a.使用枚举的单例模式 b.使用枚举,static处调用,初始化一次 -------------------------------------------------- 1.定义 确保一个类只有

Java 设计模式 单例模式(Singleton) [ 转载 ]

Java 设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创建对象 第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 5 public static Singleton getInstan

设计模式——单例模式(Java)——考虑多线程环境下的线程安全问题

设计模式--单例模式(Java)--考虑多线程环境下的线程安全问题 一:单例模式概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例 二:单例模式的实现方式 特别注意,在多线程环境下,需要对获取对象实例的方法加对象锁(synchronized) 方式一:(懒汉式)程序执行过程中需要这个类的对象,再实例化这个类的对象 步骤: 1.定义静态私有对象 2.构造方法私有化保证在类的外部无法实例化该类的对象 3.定义对外开放的静

最简单的设计模式——单例模式的演进和推荐写法(Java 版)

前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: 有这样一个类,该类在生命周期内有且只能有一个实例,该类必须自己创建自己的这个唯一实例,该类必须给所有其他对象提供这一实例(提供全局访问点),这样的类就叫单例类. 简单的说就是满足三个条件: 1.生命周期内有且只能有一个实例 2.自己提供这个独一无二的实例 3.该实例必须是能全局访问的 需要的考虑的

设计模式——单例模式学习

单例模式属于设计模式中的创建模式,即创建对象时,不再由我们直接实例化对象,而是根据特定场景,由程序来确定创建对象的方式,从而保证更大的性能.更好的架构优势. 1.概念 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.选择单例模式就是为了避免不一致状态.使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection). Singleton模式看起来简单,使用方法也很方便,但是真正用好,是非常不容易,需要对

Android中的设计模式-单例模式

Android中的设计模式-单例模式 单例模式算是比较常用的模式,在Java中如果想要一个JVM中只存在某个类的一个实例,就需要使用到单例模式,而只存在一个实例的需求一般是因为: 1,对象实例比较大和复杂,创建开销很大. 2,只需要一个实例来维护整个功能的流程与交互. 例如Android中的电话应用启动时,对于单卡单待的电话,只创建一个Phone对象,用来管理RIL,CallTracker,ServiceStateTracker等对象,手机中不存在第二个Phone对象去和RILC通信. 类图 单

php实现设计模式————单例模式

php实现设计模式----单例模式 什么是单例模式 为什么要使用单例模式 php中有哪些方式实现新建一个对象实例 如何阻止这种实例化实现理想的单例模式 代码实现 什么是单例模式 为什么要使用单例模式 php中有哪些方式实现新建一个对象实例 1. new test();//通过new实例化对象 2. 通过clone复制对象 3. 通过序列化反序列化得到对象实例 4. 通过类的反射实例化对象 1 2 3 4 如何阻止这种实例化实现理想的单例模式 1. new test();//通过new实例化对象

设计模式 - 单例模式之多线程调试与破坏单例

前言 在之前的 设计模式 - 单例模式(详解)看看和你理解的是否一样? 一文中,我们提到了通过Idea 开发工具进行多线程调试.单例模式的暴力破坏的问题:由于篇幅原因,现在单独开一篇文章进行演示:线程不安全的单例在多线程情况下为何被创建多个.如何破坏单例. 如果还不知道如何使用IDEA工具进行线程模式的调试,请先阅读我之前发的一篇文章: 你不知道的 IDEA Debug调试小技巧 一.线程不安全的单例在多线程情况下为何被创建多个 首先回顾简单线程不安全的懒汉式单例的代码以及测试程序代码: /**