服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java中finalize()的另类用法

ad_qqread_mid_big">
  上面演示中,用户信息的移除是通过调用类的logout()方法来实现的。但假如用户没有点按<注销>按钮而直接关闭ie或转到其他网站,该用户信息不是就一直存留在系统中吗?

  让我们看看类testsession中的一个方法:

protected void finalize() {
this.removeappses(this.user,this.vsid);
}

  用户访问应用,只有一个入口:login。应用的所有用户登录都可以被观察到。用户离开应用,有三种可能:注销、转到其他网站、直接关闭浏览器。选择注销离开应用,可以被程序观察到(logout),而后两种方式的离开应用,却不会调用logout。要观察到后两种方式,就需要使用对象的finalize()方法。

  用户通过转到其他网站、直接关闭浏览器两种方式离开应用超过session的timeout时间时,用户的session对象会自动失效,即变为无用对象,而列入了垃圾收集器的回收范围;关联的,"寄存"在session中的testsession对象会同时变为无用对象(在其生命期,仅存在session对它的引用,session失效了,它的唯一引用者不存在了,也就变成了无用对象)。垃圾收集器运行时,首先会调用testsession的finalize(),testsession就通过在finalize()方法中清除app_vts中存储的本用户信息。在testsession类代码中可看到,finalize()调用类的removeappses()方法执行实际的清除操作。垃圾收集器的运行,除了让其根据需要自动启动外,也可通过程序调用来启动它,比如:system.gc() 就直接启动系统垃圾收集动作。

  可以想见,本例如果不利用类的finalize()方法,我们很难找到另一种简便的途径来达到清除用户信息的目的,因为用户非正常离开应用的事件对web服务端来说是无法感知的。

  在testsession类代码中还有一个比较特殊的地方,实现用户信息加入和清除的两个方法addappses 和removeappses都被定义为static synchronized 类型。为什么呢?这是同步的需要。

  app_vts是个应用级的全局可共享对象,在同一时刻连接到web 上的有多个用户,这些用户都可以操作对象app_vts。如果有两个或以上的用户同时调用testsession的addappses或removeappses方法(这是完全可能的,因为web server是多线程服务),将带来不可预料的结果。

  为了防止两个或以上的客户程序(属于不同线程)同时访问一个资源,java提供了一种内建的机制来解决冲突。这种机制就是synchronized(同步)。在一个类中将一个特定的方法设为synchronized(同步的),便可有效地防止冲突,在任何时刻,只能有一个线程调用特定对象的一个synchronized方法(尽管那个线程可以调用多个对象的同步方法),另一个线程只有等上一线程对该方法的调用执行完毕后才能获得该方法的调用权。大致的工作机制可以这样认为:每个对象都包含了一把锁(也叫作"监视器"),它自动成为对象的一部分;调用任何synchronized方法时,对象就会被锁定,不可再调用那个对象的其他任何synchronized方法,除非第一个方法完成了自己的工作,并解除锁定。在类testsession中,将 addappses和removeappses这两个方法设为了synchronized,当调用testsession对象的addappses方法时,便不能再同时调用testsession对象的removeappses方法,反之亦然。

  synchronized又有两个级别。当我们将一个方法仅仅设为synchronized时,那是对象级的"锁",虽然一个对象的synchronized方法不可同时调用,却可以同时调用不同对象的同一个synchronized方法。所以这样做还没完全解决问题,因为两个用户(各有自己的testsession对象)可以同时调用addappses方法同时操作app_vts。当我们将一个方法设为static synchronized时,则是类级的"锁"。类包含的"锁"(自动作为类的class对象的一部分),可在一个类的范围内被相互间锁定起来,从那个类创建的所有对象都共享一把"锁"。就如testsession实际所做的那样,addappses 和removeappses被定义为static synchronized 类型,这样,任一时候,所有线程用户中肯定只能有一个用户调用addappses 和removeappses两者中的一个方法,达到防止冲突的目的。

  以上样例在windows 2000、tomcat40、jdk13中通过。

>>>更多专题请看java的类专题
上一页 1 2 3 
相关内容:系统管理  服务器  存储  xml  word  
【收藏此页】【大 中 小】【打印】【关闭】
上一篇:java applet编程基础入门之变量
下一篇:java初学者---java的学习路径(全集)


10万个软件免费高速下载
教育教学 安全相关 游戏娱乐 源码下载 编程开发 数码软件 其它类别
网络软件 联络聊天 系统工具 媒体工具 图形图像 应用软件 行业软件
·java: jni完全手册
·java reflection (java反射)详解
·java连接数据库谈
·深入java字节码加密
·java虚拟机类装载:原理、实现与应用
·java反编译的研究
·jsp与java mail api
·让界面更加绚丽 java se 6.0 gui体验
·为什么是java ee 5
·使用java 输出/输出流读写数据
 
·接口和抽象类的定义方式举例说明
·用maven制作java项目发行包
·java 基础入门 pom.xml 元素描述
·用jbuilder2007开发扩展jsf标签的插
·抽象类对象类和对象包装类
·使用java实现在文件中添加字符串
·instanceof和回调概念
·java变量的赋值与传递
·java se6调用java编译器的两种新方法
·weblogic运用db的java控件访问数据库

扫描关注微信公众号