Java中finalize()的另類用法

來源:互聯網
上載者:User

做過JAVA編程的都知道,在JAVA中有一種垃圾收集器的機制,當它運行時(通常在系統記憶體低到一定限度時自動運行),會回收不再使用的對象所佔用的記憶體,所以,在JAVA程式中,我們通常只考慮建立對象,而從不關心對象的清除。Finalize()是JAVA為類提供的一種特殊方法。垃圾收集器的工作過程大致是這樣的:一旦垃圾收集器準備好釋放無用對象佔用的儲存空間,它首先調用那些對象的finalize()方法,然後才真正回收對象的記憶體。通過使用finalize(),就可以在垃圾收集器運行期間進行一些特殊的工作。下面一例就說明了finalize()的一種巧妙用法。

現在的商業應用系統越來越多的採用WEB形式。在WEB形式應用中,每一次頁面訪問是獨立的,前後不相關聯,哪怕多個使用者在同一時刻訪問應用的同一個頁面,使用者相互之間也是不知道的。如果想要檢查當前有哪些使用者正在使用系統(如準備恢複資料備份或進行系統升級時,系統管理員都很希望知道這些資訊),該怎麼辦呢? 基於Servlet、Jsp技術的WEB伺服器提供了隱含的Session、Application對象,利用它可以幫開發人員實現一些資訊的持續儲存和共用。當使用者訪問一個WEB應用時,WEB伺服器會自動建立一個Session對象,該對象可以供使用者在會話期內在應用的所有頁面中共用資料; Application是WEB應用的一個全域對象。利用Session、Application對象,可以達到跟蹤所有使用者資訊的目的。

當使用者開啟瀏覽器開始請求WEB應用的登入頁面時,WEB服務即為該客戶建立一個session,此後,在session的timeout時間內,該客戶都使用這個session(timeout時間可設定,如Tomcat伺服器是在各應用的web.xml檔案中設定)。如果使用IE瀏覽器,Session與客戶IP地址、客戶程式進程ID所共同標識的串連有對應關係,相同IP地址、相同進程的視窗(如通過IE-檔案-建立-視窗 開啟的新視窗)具有同一個session,所以session可用於標識各個獨立的客戶應用串連。

下面是一個範例

為了方便處理,先建一個簡單類(user)用來表達使用者資訊及存放sessionId:

package com;
public class user {
public String name="";
public String sessionId="";
}

另一個類(testSession)用於處理使用者的login、logout等動作資訊,使系統可以跟蹤當前串連的使用者資訊。

package com;
import java.util.Vector;
import com.user;
public class testSession {
public user User;
private Vector vsid;
public testSession()
{
User=new user();
}
public boolean verify(String username,String password)
throws Exception //驗證使用者/密碼
{
return true;
}
public void setSessionVar(String sesid,Vector sid) {
this.User.sessionId=sesid;
this.vsid=sid;
}
private static synchronized void addappses(user puser,
Vector pvsid) { //記錄一個新串連的使用者
int pos=-1;
user l_user;
if (puser==null || pvsid==null)
return;
for(int i=0;i<pvsid.size();i++){
l_user=(user)pvsid.get(i);
if(l_user.sessionId.equals(puser.sessionId)){
pos=i;
break;
}
}
if(pos==-1){
pvsid.add(puser);
}
else{
pvsid.set(pos,puser);
}
}
private static synchronized void removeappses(user puser,
Vector pvsid) { //移除一個退出的使用者
int pos=-1;
user l_user;
if (puser==null || pvsid==null)
return;
for(int i=0;i<pvsid.size();i++){
l_user=(user)pvsid.get(i);
if(l_user.sessionId.equals(puser.sessionId)){
pos=i;
break;
}
}
if(pos!=-1){
pvsid.remove(pos);
}
}
protected void finalize() {
this.removeappses(this.User,this.vsid);
}
public boolean login(String username) throws Exception
{ //處理登入
this.User.name=username;
this.addappses(this.User,this.vsid);
return true;
}
public boolean logout() throws Exception
{ //處理登出
this. finalize();
this.User=null;
this.vsid=null;
return true;
}
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.