首页 > 软件开发 > JAVA >

java单例模式怎么做

来源:互联网 2023-03-16 19:22:49 288

Java是一门面向对象编程语言,不仅吸收了C 语言的各种优点,还摒弃了C 里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。B32办公区 - 实用经验教程分享!

Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等 。B32办公区 - 实用经验教程分享!

Java中单例(Singleton)模式是一种广泛使用的设计模式。单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在。一些管理器和控制器常被设计成单例模式。B32办公区 - 实用经验教程分享!

单例模式有很多好处,它能够避免实例对象的重复创建,不仅可以减少每次创建对象的时间开销,还可以节约内存空间;能够避免由于操作多个实例导致的逻辑错误。如果一个对象有可能贯穿整个应用程序,而且起到了全局统一管理控制的作用,那么单例模式也许是一个值得考虑的选择。B32办公区 - 实用经验教程分享!

B32办公区 - 实用经验教程分享!

单例模式的特点B32办公区 - 实用经验教程分享!

1. 单例模式只能有一个实例。B32办公区 - 实用经验教程分享!

2. 单例类必须创建自己的唯一实例。B32办公区 - 实用经验教程分享!

3. 单例类必须向其他对象提供这一实例。B32办公区 - 实用经验教程分享!

工具/原料

  • 电脑
  • intellij IDEA java编辑工具也可以使用eclipse

方法/步骤

  • 1

    第一种:懒汉模式。B32办公区 - 实用经验教程分享!

    特点:到需要用的时候才实例化,实现了懒加载B32办公区 - 实用经验教程分享!

    线程不安全B32办公区 - 实用经验教程分享!

    代码如下:B32办公区 - 实用经验教程分享!

    /** * 懒汉模式 */public class SingLetonLazy { private static SingLetonLazy instance; private SingLetonLazy(){ } public static SingLetonLazy getInstance(){ if(instance==null){ instance=new SingLetonLazy(); } return instance; }}B32办公区 - 实用经验教程分享!

    java单例模式怎么做B32办公区 - 实用经验教程分享!

  • 1相关内容未经许可获取自百度经验
  • 2

    第二种:全局访问点加同步的懒汉模式。B32办公区 - 实用经验教程分享!

    由于synchronized是锁方法, 当两个线程都要进入getsingle()时, 只有一个能进入, 并创建出实例, 然后另外一个进入后, 判断 s不为null, 然后直接得到s。 这种做法是没有错误的. 但是由于线程都需要通过getsingle()来获取对象, 所以getsingle()调用频率很高, 所以线程被锁的频率也很高, 所以这种做法效率低。简言之,不管对象有没有被创建,其余线程都只能等待这个方法的锁。B32办公区 - 实用经验教程分享!

    线程安全。B32办公区 - 实用经验教程分享!

    /** * 懒汉模式 */public class SingLetonLazy { private static SingLetonLazy instance = null; private SingLetonLazy(){} public static synchronized SingLetonLazy getInstance(){ if(null == instance){ instance = new Singleton(); } return instance; }}B32办公区 - 实用经验教程分享!

    java单例模式怎么做B32办公区 - 实用经验教程分享!

  • 3

    第三种:双重检查锁定懒汉模式。B32办公区 - 实用经验教程分享!

    这种在效率上比第二种高一些,减少了第二种加锁的的范围。B32办公区 - 实用经验教程分享!

    线程安全。B32办公区 - 实用经验教程分享!

    /** * 懒汉模式 */public class SingLetonLazy { public static SingLetonLazy s=null; private SingLetonLazy() { //私有构造方法 } public static SingLetonLazy getSingLetonLazy() { if(s==null) { synchronized(SingLetonLazy.class) { if(s==null) { s=new SingLetonLazy();//实例化 } } } return s; }}B32办公区 - 实用经验教程分享!

    java单例模式怎么做B32办公区 - 实用经验教程分享!

  • 4

    第四种:饿汉模式。B32办公区 - 实用经验教程分享!

    特点:在程序启动,类加载的时候就初始化B32办公区 - 实用经验教程分享!

    线程安全B32办公区 - 实用经验教程分享!

    代码如下:B32办公区 - 实用经验教程分享!

    /** * 饿汉模式 */public class SingletonHungry { private static SingletonHungry instance = new SingletonHungry(); private SingletonHungry(){ } public static SingletonHungry getInstance(){ return instance; }}B32办公区 - 实用经验教程分享!

    java单例模式怎么做B32办公区 - 实用经验教程分享!

  • 5

    第五种:静态内部类实现懒汉模式。B32办公区 - 实用经验教程分享!

    特点:借助内部类的静态语句块实现B32办公区 - 实用经验教程分享!

    线程安全。B32办公区 - 实用经验教程分享!

    /*** 懒汉模式*/public class SingLetonLazy { // 静态内部类 private static class NestClass { private static SingLetonLazy instance; static { instance = new SingLetonLazy(); } } // 不能直接new private SingLetonLazy() { } public static SingLetonLazy getSingLetonLazy() { return NestClass.instance; }}B32办公区 - 实用经验教程分享!

    java单例模式怎么做B32办公区 - 实用经验教程分享!

  • 6

    第六种:枚举(优先选择这一种方式) 。B32办公区 - 实用经验教程分享!

    JDK 版本:JDK1.5 起B32办公区 - 实用经验教程分享!

    是否 Lazy 初始化:否B32办公区 - 实用经验教程分享!

    是否多线程安全:是B32办公区 - 实用经验教程分享!

    实现难度:易B32办公区 - 实用经验教程分享!

    描述:这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化。这种方式是 Effective Java 作者 Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。不过,由于 JDK1.5 之后才加入 enum 特性,用这种方式写不免让人感觉生疏,在实际工作中,也很少用。不能通过 reflection attack 来调用私有构造方法。B32办公区 - 实用经验教程分享!

    代码如下:B32办公区 - 实用经验教程分享!

    publicenumEnumSingleton{B32办公区 - 实用经验教程分享!

    INSTANCE{B32办公区 - 实用经验教程分享!

    @OverrideB32办公区 - 实用经验教程分享!

    protectedvoidwork(){B32办公区 - 实用经验教程分享!

    System.out.println("你好,是我!");B32办公区 - 实用经验教程分享!

    }B32办公区 - 实用经验教程分享!

    B32办公区 - 实用经验教程分享!

    };B32办公区 - 实用经验教程分享!

    //单例需要进行操作(也可以不写成抽象方法)B32办公区 - 实用经验教程分享!

    protectedabstractvoidwork();B32办公区 - 实用经验教程分享!

    }B32办公区 - 实用经验教程分享!

    java单例模式怎么做B32办公区 - 实用经验教程分享!

  • 7

    第七步:测试。B32办公区 - 实用经验教程分享!

    1、首先编写代码实现多线程B32办公区 - 实用经验教程分享!

    2、将累计足够的线程然后同时触发创建类请求B32办公区 - 实用经验教程分享!

    3、对比请求的类是否是同一个。B32办公区 - 实用经验教程分享!

  • 以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!B32办公区 - 实用经验教程分享!


    标签: JAVA

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号统计代码