单例模式_java程序性能优化

单例模式是一种对象创建模式,用于生产一个对象的具体实例,他保证系统中一个类只产生一个实例,单例模式的好处:

1、对于频繁使用的对象,可以省略对象创建的时间

2、由于new操作的次数减少,因而对系统内存的使用频率也会降低,减轻GC压力,缩短GC停顿时间

单例模式主要针对于系统的关键组件和被频繁使用的对象,使用它可以有效改善系统的性能。

单例类必须要有:1、private访问级别的构造函数,只有这样才能确保单例不会在系统的其他代码内被实例化;2、instance(实例对象)和getInstance()(获取实例对象的方法)方法必须是static


单例模式实现方式一:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class Singleton01 {  
  2.     private Singleton01(){  
  3.         System.out.println("singleton is create");  
  4.     }  
  5.     private static  Singleton01 singleton01=new Singleton01();  
  6.     public static  Singleton01 getInstance(){  
  7.         return singleton01;  
  8.     }  
  9. }  
不足:无法对singleton实例做延迟加载,如果这个单例类在系统中还扮演其他角色,那么在任何使用这个单例类的地方都会初始化这个单例类变量

如:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class Singleton01 {  
  2.     private Singleton01(){  
  3.         System.out.println("singleton is create");  
  4.     }  
  5.     private static  Singleton01 singleton01=new Singleton01();  
  6.     public static  Singleton01 getInstance(){  
  7.         return singleton01;  
  8.     }  
  9.     public static void createString(){  
  10.         System.out.println("createString in Singleton");  
  11.     }  
  12.       
  13. }  
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class SingleTonTest {  
  2.     public static void main(String[] args) {  
  3.           
  4.         Singleton01.createString();  
  5.     }  
  6. }  



实现方式二(使用懒加载):

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class SingleTon02 {  
  2.     private SingleTon02(){  
  3.         System.out.println("lazySingleTon is create");  
  4.     }  
  5.     private static SingleTon02 instance=null;  
  6.     public  static synchronized SingleTon02 getInstance(){  
  7.         if(instance==null){  
  8.             instance=new SingleTon02();  
  9.         }  
  10.         return instance;  
  11.           
  12.     }  
  13. }  
说明:1、静态成员变量instance初始值赋予null,保证在系统启动时没有额外的负载;

    2、在getInstatance()工厂方法中,判断单例是否存在,如果存在直接返回,如不存在则创建;

    3、getInstance()方法必须同步,否则在多线程情况下,当线程1正新建实例时,线程2可能判断instance为null,从而导致多个实例被创建。

不足:由于使用同步关键字,因此在多线程情况下,他的时耗远大于第一种单例模式。


实现方式三(使用内部类):

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class SingleTon03 {  
  2.     private SingleTon03(){  
  3.         System.out.println("staticSingle is create");  
  4.     }  
  5.     private static class SingleHolder{  
  6.         private static SingleTon03 instance=new SingleTon03();  
  7.     }  
  8.     public static SingleTon03 getInstance(){  
  9.         return SingleHolder.instance;  
  10.     }  
  11. }  
说明:1、单例模式使用内部类来维护到单例的实例,当SingleTon3被加载时,其内部类并不会被初始化,因此单例类被加载jvm时,不会初始化单例类,而当getInstance()方法被调用时,才加载SingleHolder(内部类),从而初始化instance。

   2、此种方式实例创建是在类加载时完成,因此天生对多线程友好,getInstance方法不必使用同步关键字

   3、使用内部类方式实现单例,既可以做到延迟加载,也不必使用关键字,是一种比较完善的时间。

JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java享元模式是一种软件设计模式,旨在减少应用程序的内存占用和提高性能。它提供了一种将可重用对象存储在一个共享池中的方法,而单例模式是一种设计模式,它确保某个类只有一个实例,并为整个应用程序提供一个访问点。因此,Java享元模式和单例模式之间的主要区别是,前者用于减少内存使用量和提高性能,而后者用于确保一个类只有一个实例。 ### 回答2: Java中的享元模式和单例模式是两种设计模式,它们之间有以下区别: 1. 类型不同:享元模式是一种结构型模式,主要用于减少对象的创建和内存消耗;单例模式是一种创建型模式,主要用于保证一个类只有一个实例。 2. 目的不同:享元模式的目的是通过共享相似对象来减少内存消耗,提高性能;单例模式的目的是确保一个类只有一个实例,方便全局访问。 3. 实例化的时机不同:享元模式中的对象可以在需要时动态创建和销毁,可以有多个实例;单例模式中的对象在程序启动时就会被创建,且只有一个实例。 4. 对象的使用方式不同:享元模式中的对象可以被多个客户端共享,不同的客户端可以通过传递参数来获取不同的实例;单例模式中的对象是全局唯一的,可以被所有客户端直接访问。 5. 对象的生命周期不同:享元模式中的对象的生命周期由客户端控制,可以根据需要动态创建和销毁;单例模式中的对象的生命周期始终与应用程序的生命周期保持一致。 总而言之,享元模式和单例模式在设计理念、使用场景和目的上有明显的区别。享元模式适用于需要创建大量相似对象的情况下,优化内存的消耗;而单例模式适用于需要确保全局唯一实例的情况下,方便全局访问和共享对象。 ### 回答3: Java中的享元模式和单例模式都是常见的设计模式,但它们有一些关键的区别。 首先,单例模式旨在确保一个类只能创建一个实例。它通过私有化类的构造方法,并提供一个静态方法来获取实例。这样可以确保在整个应用程序中只有一个实例。而享元模式旨在共享对象的创建和共享操作,以减少内存开销和提高性能。 其次,单例模式通常用于全局访问点,通过静态方法获取唯一实例。这对于需要共享资源或跨多个对象使用的情况非常有用。而享元模式则将对象分为可共享的内部状态和不可共享的外部状态。内部状态可以共享,外部状态需要在使用时传递。 另外,单例模式通常要求在整个生命周期内只创建一个实例。这可以通过使用懒加载或者饿汉式初始化实现。而享元模式可以根据需要创建多个实例并共享内部状态。 最后,单例模式主要关注如何创建和管理对象的唯一实例。而享元模式主要关注如何共享对象以减少内存消耗和提高性能。 综上所述,单例模式着重确保只有一个实例存在,而享元模式着重通过共享对象来减少内存开销。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值