2013-06-06 67 views
-3

我有一個global variable調用loginAttemptservlet class。如果兩個requests同時擊中,這個global variable會發生什麼?會發生什麼是一個不可預見的事件。在servlet中使用全局變量evil?

在servlet中有全局變量是邪惡的?

如果我把loginAttempt一邊doPost()它每次初始化。

+1

這不就是不同層次的背景是什麼?對不起,現在很久沒有用過servlet了。只是一個想法。 – Fildor

+1

將它存儲在會話中,任何其他地方將由所有其他用戶共享 – fmodos

+0

@fmodos您的意思是將值分享給所有不同用戶訪問的請求? –

回答

4

是的。

  1. 您的變量可由任何其他類讀取/寫入。你無法確保他們都用它做出明智的事情。其中一個可能會覆蓋它/錯誤地增加它,等等。

  2. 這是一個servlet的實例,每個JVM。所以線程可能會嘗試同時訪問它。因爲它是全局的,並且你沒有提供任何同步/訪問控制,所以它不會是線程安全的。此外,如果您曾經在某種具有不同JVM的羣集中運行該servlet,則該變量將不會在它們之間共享,並且您將擁有多個loginAttempt變量。

如果有它在servlet,使靜態的,而是不讓它公開。提供getters/setter來訪問和更新它。瞭解線程安全編程,以便多線程可以更新並安全地閱讀它。

好得多,將它存儲在servlet上下文中。這應該是你存儲這樣的servlet範圍數據的地方。

0

是的。
全局變量與大家分享

+0

而解決方案是?? –

+0

@Baadshah:根據我在你的問題中的理解,你問的是全局變量是否是邪惡的,我們應該去做它。恕我直言,我沒有回答。 – xyz

0

這取決於,如果你的變量是隻讀的,它應該沒問題。但在大多數情況下,全局變量是邪惡的。我不能給你一個解決方案,因爲我沒有你的代碼,但我相信有一種替代方法。

0

在你的用例中,它超越了邪惡。 loginAttempt將由訪問servlet的所有線程共享。

2

只要你明白通常只有一個創建的servlet實例,並且全局變量將被該servlet的所有客戶端共享,那麼它們並不是邪惡的 - 這就是每個請求,在不同線程上時間和多個用戶在同一時間。

我猜測你的全局變量loginAttempt正在計算登錄嘗試的次數,只要這是以線程安全的方式完成的話,這將是計算在此servlet上進行的登錄嘗試次數的合理方式。這將是所有用戶,但。如果你想要每個用戶的登錄嘗試,那麼你可能需要創建一個會話,並使用會話上下文來存儲這種信息。

1

在大量的併發訪問中,您可能要注意Servlet的線程安全問題......並且您可以嘗試以下方法來避免此問題...

1,

public class loginAttempt extends HttpServlet implements SingleThreadModel { 
... 
} 

2, 第二種方法: 使用​​關鍵字

3, 避免使用全局變量的

+0

在Servlets中使用'synchronized'是一種不好的做法 –

1

存儲它作爲一個會話屬性。否則,全局變量概念將會讓你完全失望。 使用會話是一個好主意,因爲它是 1)如果重新啓動Web服務,會話數據不丟失

2)在負載平衡的環境,會話數據存儲在一箇中心位置,這意味着任何服務器可以提供請求並訪問會話數據。

所以它是可以訪問但它是隱藏的。

0

首先在Java中沒有名爲global variable的術語。它們被稱爲類變量或實例變量。

其次,如果您要爲所有線程共享請求或會話範圍的數據,Servlet中的實例變量就是它的不良做法。

您可以將其用於應用程序範圍的值,通常從上下文參數獲取。或者如果數據永遠不會像常量那樣改變(不可變)。