Java语言学习了这么长时间之后,自己对于Java编程的一些细节还是稍微有点总结,正好根据云时代架构中《Java高级开发必会的50个性能优化的细节(珍藏版)》来叙述一些我和里面的点比较相符且有点感悟的地方。

1)尽量在合适的场合使用单例

  单例模式我们并不陌生,软件设计的设计模式中单例模式相对来说是比较重要的一个。单例模式的优点非常明显,就是避免多次创建同一个对象,这样可以减轻系统加载的负担,减少内存的占用,使系统的总体效率有所提高。这里我也举一个单例模式的例子:

public class Singleton {

    private static Singleton singleton;

    private Singleton(){}

    public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton()
}
return singleton;
}
}

可以看到单例模式的特点:1)有一个静态成员变量,变量的类型为本类;2)构造方法为私有,这是为了防止在外面调用构造函数。

通过这段代码:单例模式在当前成员变量已经创建了之后即已经存在了之后就不会再次创建而是直接返回这一个对象,这样可以防止对象的重复创建。

但是这种方法也有局限:这种写法是懒汉式的一种,但它只适用于单线程下的使用,当使用多线程的时候,如果有两个同时访问这段代码,第一个判断为空后就会创建一个对象,但此时第二个也已经执行完毕,也判断其为空,同样也会创建一个对象,这就使单例模式的作用没有发挥出来,有兴趣的可以多去研究研究。

2)尽量避免过多过常的创建Java对象。

这句话看着确实有道理,但是很少有人注意,感觉这句话没有很适合的场景,自己从来没有过多的创建过Java对象,这里我写一段大家非常之熟悉的代码:

PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet rs = preparedStatement.executeQuery();
List<User> users = new ArrayList<User>();
while(rs.next()) {
User user = new User();
user.setUserName(rs.getString("username"));
user.setPassword(rs.getString("password"));
users.add(user);
}
return users;

这端代码相信经历过JavaWeb开发的人员们并不陌生甚至来说是非常熟悉,这段代码实现的就是从数据库查询出所有的用户并返回,当然这段代码本身是没有错误的,但是我现在稍微进行改进一下:

在while循环上面加一句话:User user = null; 然后将红色标注的部分改成user = new User();

这两个一对比就会发现,第一种虽然可以实现,但是没执行一次while循环就会创建一个User类的对象,假如数据库中有100000条数据,执行这一次查询之后就会创建100000个对象,这对系统造成的压力可想而知,虽然以现在的电脑配置等的处理这么多问题不是事。但是这种优化我们还是应该知道的;然后我们再来看第二写法,先是声明了一个对象,但并没有赋值;然后每执行一次while循环就只会给之前创建的这个对象赋值然后返回,也就是说,通过100000次循环之后,我们只是创建了一个对象,这和之前相比起来改进还是挺大的吧。

3)尽量在finally块中释放资源

异常的处理一直是被开发人员关注但却怎么也达不到完美的技术。可以这样说,如果一个程序员开发的系统将所有的异常都处理的非常好,那他绝对是超乎常人的存在。在日常开发中,我们也会遇到异常的问题,常见的有空指针、下标越界等,所以,异常的处理就显得特别重要,要不然将来让用户看到HTTP 500的时候用户会怎么想。而在异常处理中,finally一直没有被我们重视,一般我们在使用异常的时候仅仅使用try...catch并没有考虑到finally,但其实finally的存在使得我们在考虑什么时候关闭资源的问题不复存在,我不管你再try还是catch里面执行什么操作,在我finally这里就执行最后的收尾就可以了。日常使用的比如文件的关闭、对象的释放、使用最多的还有数据库对象的关闭等在finally中写上不仅使得程序的结构更加清晰,而且不会出现这样那样的问题。

云时代架构阅读笔记一——Java性能优化(一)的更多相关文章

  1. 云时代架构阅读笔记二——Java性能优化(二)

    承接上文Java性能优化(一)https://www.cnblogs.com/guo-xu/p/11019267.html 4)尽量确定StringBuffer的容量 在说和这个标题相关之前,先说一下 ...

  2. 云时代架构阅读笔记六——Java内存模型详解(二)

    承接上文:云时代架构阅读笔记五——Java内存模型详解(一) 原子性.可见性.有序性 Java内存模型围绕着并发过程中如何处理原子性.可见性和有序性这三个特征来建立的,来逐个看一下: 1.原子性(At ...

  3. 云时代架构阅读笔记七——Java多线程中如何使用synchronized关键字

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...

  4. 云时代架构阅读笔记五——Java内存模型详解(一)

    什么是Java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的访问差异,以实现让Java程序在各种平台下都能达到一致 ...

  5. 云时代架构阅读笔记十一——数据库SQL优化

    网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 ...

  6. 云时代架构阅读笔记十五——之前碰到的Java面试题

    1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.Java有 ...

  7. 云时代架构阅读笔记十六——Hystrix理解

    背景 分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务.如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,最终可能导致整个商品服 ...

  8. 云时代架构阅读笔记十四——我对Hash算法的理解

    Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是 ...

  9. 云时代架构阅读笔记九——web应用存在的问题及解决办法

    web应用通常存在的10大安全问题 1.SQL注入 拼接的SQL字符串改变了设计者原来的意图,执行了如泄露.改变数据等操作,甚至控制数据库服务器, SQL Injection与Command Inje ...

随机推荐

  1. 你知道HTTP协议的ETag是干什么的吗?

    前言 在HTTP1.1规范中,新增了一个HTTP头信息:ETag.对于普通开发者来说,可能平时真的不会接触到该HTTP头.平时接触不到或者说用得少,不代表这个请求头不重要.ETag使用得当,是可以减少 ...

  2. sklearn实现决策树算法

    1.决策树算法是一种非参数的决策算法,它根据数据的不同特征进行多层次的分类和判断,最终决策出所需要预测的结果.它既可以解决分类算法,也可以解决回归问题,具有很好的解释能力.另外,对于决策树的构建方法具 ...

  3. 【转载】如何快速转载CSDN中的博客

    前言   对于喜欢逛CSDN的人来说,看别人的博客确实能够对自己有不小的提高,有时候看到特别好的博客想转载下载,但是不能一个字一个字的敲了,这时候我们就想快速转载别人的博客,把别人的博客移到自己的空间 ...

  4. 1_02_MSSQL课程_T_SQL语句入门

    1.->全名:结构化查询语言(Structured Query Language)    关系数据库管理系统的标准语言. ->SQL主要分为三种语言:DML\DDL\DCL DDL(数据定 ...

  5. display:flex下子元素宽度无效

    在子元素上设置: width:60px; flex-shrink:0;

  6. tomcat点击startup.bat出现闪退,启动不成功的解决办法

    问题描述:tomcat点击startup.bat出现命令行闪退的情况 打开startup.bat,在第一行加入 SET JAVA_HOME=D:\jdk\jdk1.8.0_121[jdk路径] SET ...

  7. 机器学习(ML)十一之CNN各种模型

    深度卷积神经网络(AlexNet) 在LeNet提出后的将近20年里,神经网络一度被其他机器学习方法超越,如支持向量机.虽然LeNet可以在早期的小数据集上取得好的成绩,但是在更大的真实数据集上的表现 ...

  8. os期末复习

    登记之后会发生两个变化:读者数增加(v操作).座位数减少(p操作) 注销之后会发生的变化:读者数减少(p操作).座位数增加(v操作) 必须要清楚释放的是甚麽,以及申请的是甚麽资源(在具体的题目当中) ...

  9. spark动态资源(executor)分配

    spark动态资源调整其实也就是说的executor数目支持动态增减,动态增减是根据spark应用的实际负载情况来决定. 开启动态资源调整需要(on yarn情况下) 1.将spark.dynamic ...

  10. 南邮CG-CTF Web记录

    MYSQL(利用精度,传参为小数) robots.txt中的代码: <?php if($_GET[id]) { mysql_connect(SAE_MYSQL_HOST_M . ':' . SA ...