java设计优化--单例模式

单例模式是一种对象创建模式,确保系统中一个类只有一个实例。

在java语言中,这样做有两大好处:

1.对于频繁使用的对象,可以省略创建对象所话费的时间;

2.由于new操作的次数减少,对于系统内存的使用频率降低,这样减少GC的压力,缩短GC停顿的时间。

单例模式细分:

1.

 1 public class Singleton{
 2     private Singleton(){
 3         System.out.println("Singleton.Singleton()");
 4     }
 5
 6     private static Singleton singleton = new Singleton();
 7
 8     public static Singleton getInstance(){
 9         return singleton;
10     }
11 }

注意:首先单例类必须有一个private访问级别的构造函数,确保单例不会被系统其他代码实例化;其次,singleton成员变量和getInstance()方法必须是static的。

这个单例类创建十分简单,而且非常可靠。唯一的缺点是无法对singleton做延迟加载,例如由于单例创建过程很慢,由于成员变量定义为static,在jvm加载单例类时,单例对象也会被创建,那么在任何用到单例类的地方都会创建单例对象,不管单例对象是否被用到。例如:

public class Singleton{
    private Singleton(){
        System.out.println("Singleton.Singleton()");
    }

    private static Singleton singleton = new Singleton();

    public static Singleton getInstance(){
        return singleton;
    }

    public static void createString(){
        System.out.println("Singleton.createString()");
    }
}

2.为了提高相关函数的调用速度,就需要引入懒加载机制。

 1 package com.luchao.singtonle;
 2
 3 public class LazySingleton {
 4     private LazySingleton() {
 5         System.out.println("LazySingleton.LazySingleton()");
 6     }
 7     private static LazySingleton lazyInstance = null;
 8
 9     public synchronized static LazySingleton getInstance(){
10         if(lazyInstance==null)
11             lazyInstance = new LazySingleton();
12         return lazyInstance;
13     }
14 }

对于静态变量singleton初始化赋值为null,确保系统启动时没有额外的负荷。在getInstance()方法中,判断当前实例十分已经存在,如果存在则返回,如果不存在,再建单例。getInstance()必须为同步方法,因为在多线程环境下,当线程1正在建单例,未完成赋值前,线程2可能判断instance为null,故线程2将启动建立新建单例的程序,导致多个单例被创建。

上面实例单例实现,虽然实现了延迟加载,但是引入了同步方法,在多线程环境下,耗时远大于第一个单例程序。

3.单例模式使用内部类来维护单例的创建

 1 public class StaticSingleton {
 2     private StaticSingleton() {
 3         System.out.println("StaticSingleton.StaticSingleton()");
 4     }
 5
 6     private static class SingletonHolder{
 7         private static StaticSingleton ataticSingleton = new         StaticSingleton();
 8     }
 9
10     public static StaticSingleton getInstance(){
11         return SingletonHolder.ataticSingleton;
12     }
13
14 }

StaticSingleton被加载时,内部类不会被实例化,确保StaticSingleton类被载入jvm时,不会被初始化单例类,而当getInstance()方法被调用时,才加载SingletonHolder,从而初始化instance。同时用于实例的建立在类加载时完成,故天生对线程友好。

使用内部类完成单利模式,既可以做到延迟加载,也不用使用同步关键字,是一种比较完善的做法。

时间: 2024-08-10 18:03:38

java设计优化--单例模式的相关文章

java设计优化--观察者模式

观察者模式介绍 观察者模式是一种非常有用的设计模式,在软件系统中,当一个对象的行为依赖于另一个对象的状态时,观察者模式就非常有用.如果不适用观察者模式,而实现类似的功能,可能就需要另外启动一个线程不停地监听另一个对象的状态,这样会得不偿失.如果在一个复杂的系统中,可能就需要开启很多的线程来监听对象状态的变化,这样会使系统的性能产生额外的负担.而观察者模式就可以在单线程下使某一对象及时得知所依赖对象状态的变化而做出行为. 观察者模式的经典结构: 其中ISubject是观察对象(被观察者对象),它维

java设计优化--代理模式

代理模式使用代理对象完成用户的请求,屏蔽用户对真实对象的访问. 代理模式的用途很多,比如因为安全原因,需要屏蔽客户端直接访问真实对象:或者在远程调用中,需要使用代理对象处理远程方法中的技术细节:或者为了提升系统,对真是对象进行封装,从而达到延迟加载的目的. 在系统启动时,将消耗资源最多的方法使用代理模式分离,就可以加快系统的启动速度,减少用户的等待时间.在用户真正在做查询是,再由代理类加载真实的类,完成用户请求.这就是使用代理模式达到延迟加载的目的. 1.静态代理实现: 主题接口: 1 publ

java设计优化-享元模式

享元模式是设计模式中少数几个以调高系统性能为目的的设计模式.它的核心思想是:如果在一个系统中存在多个相同的对象,那么只需共享一份对象的拷贝,而不必为每一次使用都创建新的对象.在享元模式中,由于需要构建和维护这些可以共享的对象,因此,常常会出现一个工厂类,用于维护和创建对象. 享元模式对性能提升的主要帮助有两点: 1.可以节省重复创建对象的开销,因为被享元模式维护的相同对象只会被创建一次,当对象创建比较耗时时,便可以节省大量时间: 2.由于创建对象的数量减少,所有对系统内存的需求也减少,这样使GC

Java程序性能优化——设计优化

原文出自:http://blog.csdn.net/anxpp/article/details/51914119,转载请注明出处,谢谢! 1.前言 OK,之前写了一篇文章:"23种设计模式介绍以及在Java中的应用"详细介绍了如何将设计模式应用到Java编程中,而本文旨在介绍如何利用他们优化我们的程序,使其性能更佳. 设计模式的详细介绍请参照上面链接中的文章,不是本文的重点. 而Java程序的性能优化,不一定就仅仅是以提高系统性能为目的的,还可能是以用户体验.系统可维护性等为目的. 2

Java 性能优化系列之1[设计与程序优化]

性能 一般来说,性能通过以下几个方面来表现: 执行速度 内存分配 启动时间 负载承受能力 定量评测的性能指标: 执行时间 CPU时间 内存分配 磁盘吞吐量 网络吞吐量 响应时间 调优的层面 设计调优 代码调优 JVM调优 数据库调优 操作系统调优 性能调优必须有明确的目标,不要为了调优而调优,如果当前程序并没有明显的性能问题,盲目地进行调整,其风险可能远远大于收益. 设计优化 1. 单例模式 对于系统的关键组件和被频繁使用的对象,使用单例模式可以有效地改善系统的性能 2. 代理模式 代理模式可以

《Java程序性能优化》学习笔记 Ⅰ设计优化

豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞吐量: 响应时间: 2.木桶定律   系统的最终性能取决于系统中性能表现最差的组件,例如window系统内置的评分就是选取最低分.可能成为系统瓶颈的计算资源如,磁盘I/O,异常,数据库,锁竞争,内存等. 性能优化的几个方面,如设计优化,Java程序优化,并行程序开发及优化,JVM调优,Java性能调

java模式:深入单例模式

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://devbean.blog.51cto.com/448512/203501 在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容易出现问题.下面就单例设计模式详细的探讨一下. 所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实

Java 程序优化 (读书笔记)

--From : JAVA程序性能优化 (葛一鸣,清华大学出版社,2012/10第一版) 1. java性能调优概述 1.1 性能概述 程序性能: 执行速度,内存分配,启动时间, 负载承受能力. 性能指标: 执行时间,CPU时间,内存分配,磁盘吞吐量,网络吞吐量,响应时间. 优化策略: 木桶原理,优化性能瓶颈. 1.2 性能调优的层次 设计调优, 代码调优, JVM调优, 数据库调优, 操作系统调优. 2. 设计优化 2.1 善用设计模式 单例模式: 对于巨大对象,节省创建对象的时间空间: 代理

推荐:Java性能优化系列集锦

Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演进,内建了更为成熟的优化技术.运行时技术和垃圾收集器.与此同时,底层的硬件平台和操作系统也在演化. 目录: 一.Java性能优化系列之一--设计优化 二.Java性能优化系列之二--程序优化 三.Java性能优化系列之三--并发程序设计详解 四.Java性能优化系列之四--Java内存管理与垃圾回收