Java程序性能优化-读书笔记(一) 单例模式
单例模式:
目的:
确保系统中一个类只产生一个实例。
好处:
1.对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销。
2.由于new操作的次数减少,因而对系统内存的使用频率也会降低,减轻GC压力,缩短GC的停顿时间。
单例模式的角色:
| 角色 | 作用 |
| 单例类 | 提供单例的工厂,返回单例 |
| 使用者 | 获取病使用单例类 |
代码实现:
public class Singleton {
private Singleton(){}
private static Singleton instance = new Singleton();
public static Singleton() {
return instance;
}
}
上述的单例实现,可以确保一个系统中只有一个实例。但是却有另外一个问题,就是由于实例成员变量是static,因此JVM在加载单例类时,单例对象就会被创建。
如果单例类此时还承载着其他用途,那么不管这个单例类是否会被用到,都会初始化这个单例变量。
如下的代码:
public class Singleton {
private Singleton() {
System.out.println("Singleton is create");
}
private static Singleton instance = new Singleton();
private static Singleton getInstance() {
return instance;
}
/**
* 模拟单例类中扮演其他角色
*/
public static void createString() {
System.out.println("createString in Singleton");
}
}
当在main方法中尝试调用createString方法时,会看到私有构造中的打印语句被输出了,说明在调用createString时实例化了instance变量。
这也许并不是你想要的结果,如果我们希望对象在使用时再被创建,那么就需要引入延时加载的机制:
public class LazySingleton {
private LazySingleton(){
System.out.println("LazySingleton is create");
}
private static LazySingleton instance = null;
public static synchronized LazySingleton getInstance() {
if(null == instance) {
instance = new LazySingleton();
}
return instance;
}
public static void createString() {
System.out.println("createString");
}
}
上述的代码实现了延时加载,同时在获取实例的方法中加入了synchronized关键字,为了确保在多线程环境下的线程安全问题。
但是同样由于synchronized关键字,它的耗时也要远远多于第一种。
为了延时加载,而降低了系统性能有点得不偿失。所以在此改进单例代码:
public class Singleton {
private Singleton(){}
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
上述的代码采用内部类的形式来实现单例代码,首先,单例对象在内部类中进行实例化,而内部类只有在调用getInstance方法时才会被调用一次。从而实现了延时加载。
而且由于java内部类的加载是线程安全的,同时也解决了多线程下单例的问题。
Java程序性能优化-读书笔记(一) 单例模式的更多相关文章
- Java程序性能优化读书笔记(一):Java性能调优概述
程序性能的主要表现点: 执行速度:程序的反映是否迅速,响应时间是否足够短 内存分配:内存分配是否合理,是否过多地消耗内存或者存在内存泄漏 启动时间:程序从运行到可以正常处理业务需要花费多少时间 负载承 ...
- java程序性能优化读书笔记-垃圾回收
衡量系统性能的点 执行速度:即响应时间 内存分配:内存分配是否合理,是否过多消耗内存或者存在内存泄露 启动时间:程序从启动到正常处理业务需要的时间 负载承受能力:当系统压力上升,系统执行速度和响应时间 ...
- Java程序性能优化技巧
Java程序性能优化技巧 多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for ...
- 《Java程序性能优化:让你的Java程序更快、更稳定》
Java程序性能优化:让你的Java程序更快.更稳定, 卓越网更便宜,不错的书吧
- [JAVA] java程序性能优化
一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...
- Java程序性能优化之性能概述
性能的基本概念 一).什么叫程序的性能? 程序运行所需的内存和时间. 二).性能的表现形式: 1).执行速度: 程序的反应是否迅速,响应时间是否足够短. 2).启动时间:程序从运行到可以处理正常业务所 ...
- 《Java程序性能优化》学习笔记 设计优化
豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞 ...
- Java程序性能优化Tip
本博客是阅读<java time and space performance tips>这本小书后整理的读书笔记性质博客,增加了几个测试代码,代码可以在此下载:java时空间性能优化测试代 ...
- Java程序性能优化——让你的java程序更快、更稳定
1.Java性能调优概述 1.1.Web服务器,响应时间.吞吐量是两个重要的性能参数. 1.2.程序性能的几个表现: 执行速度:程序的反映是否迅速,响应时间是否足够短 内存分配:分配是否合理,是否过多 ...
随机推荐
- Android 开发—— 小工具,大效率
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:姚志锋 一.Hugo插件 -- 打印方法运行时间 首先申明下,此Hugo非 彼Hugo(Hugo是由Go ...
- gitlab 取消注册功能
gitlab 默认安装完成以后是允许用户注册,公司内部使用所以准备禁用了注册功能,只允许管理员从后台开通权限: 1.进入"Admin Area" 2.在左边菜单栏最低下点击&quo ...
- Akka(2):Actor生命周期管理 - 监控和监视
在开始讨论Akka中对Actor的生命周期管理前,我们先探讨一下所谓的Actor编程模式.对比起我们习惯的行令式(imperative)编程模式,Actor编程模式更接近现实中的应用场景和功能测试模式 ...
- 022 component(组件)关联映射
Component关联映射: 目前有两个类如下: 值对象没有标识,而实体对象具有标识,值对象属于某一个实体,使用它重复使用率提升,而且更清析. 以上关系的映射称为component(组件)关联映射 在 ...
- ACL配置
标准acl 1-99:抓源地址 扩展acl 100-199:抓源地址,目标地址,具体数据包(如:icmp,tcp,udp,ospf,ip等) 实验内容 1:ACL实现禁止192.168.1.0网段所有 ...
- [.NET跨平台]Jeuxs独立版本的便利与过程中的一些坑
本文环境与前言 之前写过一篇相关的文章:在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验 当时的部署还是比较繁琐的,而且需要联网下载各种东西..有兴趣的可以看看, ...
- 跟着刚哥深入学maven
前言:目前所有的项目都在使用maven,可是一直没有时间去整理学习,这两天正好有时间,好好的整理一下. 一.为什么使用Maven这样的构建工具[why] ① 一个项目就是一个工程 如果项目非常庞大,就 ...
- 腾讯AlloyTeam正式发布omi-cli脚手架 v1.0 - 创建网站无需任何配置
omi-cli omi-cli omi-cli命令 omi框架 用户指南 文件目录 npm 脚本 npm start npm run dist 代码分割 兼容 IE8 插入 CSS 插入组件局部 CS ...
- 【小练习02】CSS--网易产品
要求用css和HTML实现下图效果: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8& ...
- 网络编程应用:基于TCP协议【实现对象传输】--练习
要求: 基于TCP协议实现,客服端向服务器发送一个对象 服务器接受并显示用户信息 ,同时返回给客户端 "数据已收到" 建一个Student类,属性:name age Student ...