我有一個global variable
調用loginAttempt
在servlet class
。如果兩個requests
同時擊中,這個global variable
會發生什麼?會發生什麼是一個不可預見的事件。在servlet中使用全局變量evil?
在servlet中有全局變量是邪惡的?
如果我把loginAttempt
一邊doPost()
它每次初始化。
我有一個global variable
調用loginAttempt
在servlet class
。如果兩個requests
同時擊中,這個global variable
會發生什麼?會發生什麼是一個不可預見的事件。在servlet中使用全局變量evil?
在servlet中有全局變量是邪惡的?
如果我把loginAttempt
一邊doPost()
它每次初始化。
是的。
您的變量可由任何其他類讀取/寫入。你無法確保他們都用它做出明智的事情。其中一個可能會覆蓋它/錯誤地增加它,等等。
這是一個servlet的實例,每個JVM。所以線程可能會嘗試同時訪問它。因爲它是全局的,並且你沒有提供任何同步/訪問控制,所以它不會是線程安全的。此外,如果您曾經在某種具有不同JVM的羣集中運行該servlet,則該變量將不會在它們之間共享,並且您將擁有多個loginAttempt變量。
如果有有它在servlet,使靜態的,而是不讓它公開。提供getters/setter來訪問和更新它。瞭解線程安全編程,以便多線程可以更新並安全地閱讀它。
好得多,將它存儲在servlet上下文中。這應該是你存儲這樣的servlet範圍數據的地方。
這取決於,如果你的變量是隻讀的,它應該沒問題。但在大多數情況下,全局變量是邪惡的。我不能給你一個解決方案,因爲我沒有你的代碼,但我相信有一種替代方法。
在你的用例中,它超越了邪惡。 loginAttempt將由訪問servlet的所有線程共享。
只要你明白通常只有一個創建的servlet實例,並且全局變量將被該servlet的所有客戶端共享,那麼它們並不是邪惡的 - 這就是每個請求,在不同線程上時間和多個用戶在同一時間。
我猜測你的全局變量loginAttempt
正在計算登錄嘗試的次數,只要這是以線程安全的方式完成的話,這將是計算在此servlet上進行的登錄嘗試次數的合理方式。這將是所有用戶,但。如果你想要每個用戶的登錄嘗試,那麼你可能需要創建一個會話,並使用會話上下文來存儲這種信息。
在大量的併發訪問中,您可能要注意Servlet的線程安全問題......並且您可以嘗試以下方法來避免此問題...
1,
public class loginAttempt extends HttpServlet implements SingleThreadModel {
...
}
2, 第二種方法: 使用關鍵字
3, 避免使用全局變量的
在Servlets中使用'synchronized'是一種不好的做法 –
存儲它作爲一個會話屬性。否則,全局變量概念將會讓你完全失望。 使用會話是一個好主意,因爲它是 1)如果重新啓動Web服務,會話數據不丟失
2)在負載平衡的環境,會話數據存儲在一箇中心位置,這意味着任何服務器可以提供請求並訪問會話數據。
所以它是可以訪問但它是隱藏的。
首先在Java中沒有名爲global variable
的術語。它們被稱爲類變量或實例變量。
其次,如果您要爲所有線程共享請求或會話範圍的數據,Servlet中的實例變量就是它的不良做法。
您可以將其用於應用程序範圍的值,通常從上下文參數獲取。或者如果數據永遠不會像常量那樣改變(不可變)。
這不就是不同層次的背景是什麼?對不起,現在很久沒有用過servlet了。只是一個想法。 – Fildor
將它存儲在會話中,任何其他地方將由所有其他用戶共享 – fmodos
@fmodos您的意思是將值分享給所有不同用戶訪問的請求? –