`

JDK7资源自动释放的介绍与深入思考

阅读更多

 

 
       资源自动释放是JDK7的一个重大改进。 jdk7提供了try-with-resources,可以自动关闭相关的资源(只要该资源实现了AutoCloseable接口,jdk7为绝大部分资源对象都实现了这个接口)。
 

try-with-resources 语句是一个声明了1到多个资源的try语句。资源是指这个try执行完成后必需close掉的对象,比如connection, resultset等。

 

try-with-resources 语句会确保在try语句结束时关闭所有资源。实现了java.lang.AutoCloseablejava.io.Closeable的对象都可以做为资源。

 

     下面是一个例子,它会从一个文件中读出首行文本,这里使用了BufferedReader 的实例来读取数据,BufferedReader 是一个资源,它应该在程序完成时被关闭。
     
static String readFirstLineFromFile(String path) throws IOException {  
   try (BufferedReader br = new BufferedReader(new FileReader(path))) {  
      return br.readLine();  
   }  
}  
 

       可以看到,由于BufferedReader被定义在try-with-resource 语句中,因此不管try代码块是正常完成或是出现异常,这个BufferedReader 的实例都将被关闭。

 

       而在java7之前的版本中,需要使用finally 代码块来确保资源被关闭(不管try正常完成还是出现异常)。
 
    static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {  
      BufferedReader br = new BufferedReader(new FileReader(path));  
      try {  
        return br.readLine();  
      } finally {  
        if (br != null) br.close();  
      }  
    }  
 
 
         以上是JDK7自动关闭的一个总结,实例都是使用的其他人文章里的。看到这些问题,让我心里一动,提出一个我的问题是,自动释放机制能否区分是正常释放还是异常释放?具体的说,就是这个释放,是try块正常完成了还是出现异常了需要释放?
      之所以提出这个问题,就是因为资源释放是代码非常容易出现bug的场景,而异常情况下是否能合理清理资源、释放资源又是其中最最容易出错的地方。
 
从数据库相关开发的角度看,例如下面的代码:
Connection connection = null;
Statement statement = null;

try{
    connection = pool.getConnection();
    statement = connection.createStatemnet();
    boolean executionStatus= statement.execute(“query”);
}catch(Exception e){
    //Block of code for handle the exception
    e.printStacktrace();
}finally{
    try{
        statement.close();
        connection.close();
    }catch(Exception e){
    //block of statements for handle exceptions.
}
 
在JDK7中简化成
Connection connection = null;
Statement statement = null;

try(//请注意这里的小括号,不是大括号
    connection =   pool.getConnection();
    statement = connection.createStatemnet()
)
{
    boolean executionStatus= statement.execute(“query”);
}catch(Exception e){
    //block of statements for handles the exceptions
}
 
在上面的情况下,如果需要事务控制,变成:
Connection connection = null;
Statement statement = null;

try(//请注意这里的小括号,不是大括号
    connection =   pool.getConnection();
    statement = connection.createStatemnet()
)
{
    boolean executionStatus= statement.execute(“query”);
	conn.commit();
}catch(Exception e){
    //block of statements for handles the exceptions
	conn.rollback();
}
 
 
       正常执行,到最后,需要提交事务;异常关闭,需要先回滚,然后再关闭。这个事务的控制还得要自己写代码才行。
      所以对Oracle提供的java.lang.AutoCloseable接口有一些疑问,为什么只是提供了一个这样的接口供实现:
 
 void close()
 
为什么不是:
 
     normalClose();//正常关闭
     errorClose();//异常关闭
 
 
     如果是接口这样设计和实现,那么开发可以变得非常简单了。
       我举的数据库连接只是一个示例(事务是一个,再有一个是如果出现异常,那么连接很有可能就不能回池了,只能销毁,因为是坏了的连接)。还有很多类似场景,正常关闭和错误关闭都需要外边很多其他额外工作,不简单的是close那么一件事。
 
      如果有这样的接口,那么,在开发过程中,在基础类实现中,前期把这些资源的释放(创建还好说,释放至关紧要)都设计实现好,把AutoCloseable需要的两个接口(可惜现在Java只有一个)实现好,那么就会很大程度上减少后期团队开发过程中出现错误。 
分享到:
评论
2 楼 windshome 2013-10-12  
谢谢提醒,已经删除。
1 楼 hanmiao 2013-10-12  
文章末尾共有13個空行,重新编辑下吧,看着难受。

相关推荐

    JDK7安装包.zip

    JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7...

    JDK资源包合集(JDK6+JDK7+JDK8)

    JDK7,即Java SE 7(标准版7),2011年推出,引入了显著的语法改进,例如try-with-resources语句,用于自动关闭资源,增强了switch语句,允许使用字符串作为case标签,以及对多路复用文件I/O的支持。此外,JDK7还...

    jdk7 for mac 资源

    标签"mac java jdk7"强调了这个资源与Mac操作系统、Java编程语言以及JDK7版本的关系。文件名"jdk-7u80-macosx-x64.dmg"揭示了这是一个适用于Mac OS X 64位系统的JDK7更新80的.dmg安装文件。DMG是苹果电脑上的镜像...

    jdk7api帮助文档

    而在JDK7中,实现了自动关闭资源的机制,只要资源实现了`java.lang.AutoCloseable`接口,就可以在try块中直接声明并使用,程序结束时会自动调用`close()`方法。 其次,多线程处理方面,JDK7引入了Fork/Join框架,它...

    JDK7免安装解压包

    **JDK7免安装解压包详解** Java Development Kit(JDK)是Oracle公司提供的用于开发和运行Java应用程序的工具集。...对于那些需要频繁更换开发环境或者对系统资源有限制的场合,这种绿色版JDK7尤为适用。

    jdk7linux非常好的资源下载

    在给定的资源中,我们关注的是JDK 7的Linux版本,特别是针对64位操作系统。JDK 7,也被称为Java 7,是Java平台的一个重要版本,发布于2011年。它引入了一系列新特性,提升了开发者的效率,并且对性能进行了优化。 #...

    jdk7 jdk8 jdk9 jdk10 jdk11 jdk12 jdk13 jdk14 (win-64位) 百度网盘下载

    jdk7 jdk8 jdk9 jdk10 jdk11 jdk12 jdk13 jdk14 (win-64位) 资源共享

    JDK7 Windows32位

    JDK7是Oracle公司发布的第七个主要版本,它在JDK6的基础上增加了一些新特性,改进了性能,并修复了许多已知问题。Windows 32位版本的JDK7是专门为在32位操作系统环境下运行而设计的,确保了在这样的平台上开发和运行...

    jdk1.8、jdk11、jdk17 资源下载

    jdk1.8、jdk11、jdk17 资源下载

    Java JDK 7学习笔记 PDF

    这个PDF学习笔记是开发者深入理解JDK 7特性和功能的重要参考资料。以下是对Java JDK 7的一些核心知识点的详细阐述: 1. **泛型改进**:在JDK 7中,泛型的使用更加灵活,引入了类型推断(Type Inference)特性,通过...

    jdk7 jdk-7u80-linux-x64 网盘下载

    ### JDK 7 (Java Development Kit 7) 版本介绍 #### 一、JDK 7 概述 JDK 7(Java Development Kit 7)是Java平台的一个重要版本,由Oracle公司发布。它是Java SE 7标准的实现,为开发者提供了用于编写Java应用程序...

    jdk7下载下载

    1. **多语言支持**:JDK7引入了`try-with-resources`语句,使得资源管理更加简洁高效。开发者可以自动关闭在try块中打开的任何实现了`AutoCloseable`接口的对象,避免了手动关闭资源可能导致的资源泄露。 2. **钻石...

    JDK7源码(JDK7u7_src.zip)

    《深入解析JDK7源码》 JDK7(Java Development Kit 7)是Java编程语言的一个重要版本,它的发布带来了许多新特性和改进,极大地提升了开发者的工作效率和代码质量。对于Java开发者而言,理解JDK源码是提升编程技能...

    jdk1.7.0_17版本 jdk7

    1. **多线程与并发优化**:JDK7加强了对多线程和并发的支持,引入了Fork/Join框架,这是一个并行计算的模型,可以将大型任务拆分为可独立执行的小任务,然后合并结果,有效利用多核处理器的优势。 2. **类型推断**...

    JDK7api JDKAPI

    1. **自动资源管理(try-with-resources)**:JDK7引入了try-with-resources语句,使得在使用完一个实现了`AutoCloseable`接口的对象后,可以自动关闭,避免资源泄露,提高了代码的可读性和安全性。 2. **多 catch ...

    jdk-7u80-windows-x64.exe 【官方下载的jdk1.7、jdk7,windows 64位版】

    Java 7,也被称为JDK 7或Java SE 7 (Java Standard Edition 7),是在2011年发布的,引入了多项重要的新特性和改进。以下是其中的关键亮点: 1. **多语言支持**:Java 7增加了对其他编程语言的支持,如Groovy、Scala...

    jdk7-aarch64-uos.tar.gz

    《深入解析JDK7在Aarch64架构下的应用与实践》 在当前的IT行业中,随着国产化软硬件的快速发展,对支持多种架构的软件需求日益增长。JDK7-aarch64-uos.tar.gz这个压缩包文件,便是针对arm64与aarch64架构的Linux...

    jdk7 64位安装版

    《深入解析JDK7 64位安装版》 JDK,全称Java Development Kit,是Java编程语言的必备工具集,为开发者提供了编写、编译、调试以及运行Java应用程序所需要的一切。JDK7是Oracle公司推出的一个重要版本,针对64位操作...

    Jdk7-8-arm.rar

    首先,JDK7是Java平台的一个重大更新,正式版本为7u40,它引入了多项新特性,如Try-with-resources语句,用于自动管理资源关闭,避免资源泄露;多 catches 语句,允许在一个catch块中捕获多种类型的异常;钻石操作符...

    jdk-7andTomcat8.0

    将JDK 7与Tomcat 8.0结合使用,开发者可以构建、测试和部署基于Java EE 7的应用程序。这个压缩包可能包含JDK 7的安装文件、Tomcat 8.0的服务器二进制文件,以及可能的教学材料、示例代码或配置文件,以帮助初学者或...

Global site tag (gtag.js) - Google Analytics