快速业务通道

Java中finalize()的另类用法 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
ss"。我们利用viewSessiones.jsp来观察结果,显示如下:

testuser_1 sessionId=A16DCE950C2C664D0AA93E05B27D8E00

testuser_2 sessionId=34B0AF3F1F2573F1C1DD12D62DF06F91

而当我们在第一个IE中按下按钮<注销>,logintest.jsp的显示为:

Java中finalize()的另类用法 - 编程入门网

Java中finalize()的另类用法(4)

时间:2010-12-13

刷新viewSessiones.jsp来观察结果,显示如下:

testuser_2 sessionId=BC487C6A9FD663EA27E797A420B41051

我们在第二个IE中按下按钮<注销>,按钮下面的文本框显示"testuser_2 login success", 刷新viewSessiones.jsp来观察结果,显示出已经没有连接的用户信息。

上面演示中,用户信息的移除是通过调用类的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,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号