簡體   English   中英

在java Web應用程序中使用靜態方法和變量

[英]Using static method and variables in java web application

我的網絡應用程序標題中有一個搜索框,並使用自動填充功能幫助用戶按作者姓名或書名來查找書籍。 在用戶輸入上, oninput()函數通過ajax調用servlet FindBooks FindBooks servlet調用類SuggestionBook靜態方法suggest() ,它返回與輸入字符串匹配的書籍數組。

FindBooks.java

 JSONArray books = SuggestionBook.suggest(inputString);
 out.print(books);

SuggestionBook.java

 private static boolean isTernaryEmpty = true;
 private static Ternary ternary;

 private static void fillTernary() {
  // fills ternary search tree with data.
  isTernaryEmpty = false;
 }

 public static JSONArray suggest(String searchString) {
  if(isTernaryEmpty) {
    fillTernary();
  }
  return ternary.find(searchString);
 } 

我在SuggestionBook.java類中使用了static方法,以避免為每個應用程序會話加載數據。 因此它只會加載一次,然后可以由不同的會話共享。 但由於靜態方法只有一個副本,並且所有會話都使用相同的static方法來獲取數據。 他們是否必須等待其他會話正在使用該方法,或者所有會話可以同時訪問它? 如果是,它是否會影響應用程序的性能。 如果否,JVM如何管理單個副本的並發訪問? 最后,根據我的理解,只要類SuggestionBook不是垃圾收集,數據將保留在內存中。 將數據結構用作class variables不是instance variables是一種正確的方法,因為它們會在較長時間內阻塞可用內存。

他們是否必須等待其他會話正在使用該方法,或者所有會話可以同時訪問它?

不,他們不必等待,是的,他們可以同時訪問。

同時從多個會話訪問同一對象可能是一個問題,但並非必須如此。 例如,如果兩個會話同時訪問對象而不改變其狀態,那就沒問題了。 如果它們確實改變了狀態並且狀態轉換涉及不穩定的中間狀態,則可能出現問題。

如果兩個線程同時運行相同的方法,則它們的代碼指針都指向該方法,並在其堆棧上擁有自己的參數和局部變量副本。 如果堆棧上的東西指向堆上的相同對象,它們只會相互干擾。

如果是,它是否會影響應用程序的性能。 如果否,JVM如何管理單個副本的並發訪問?

java中的內存分為兩類 - 堆和堆棧。 堆是所有對象都存在的地方,堆棧是線程工作的地方。 每個線程都有自己的堆棧,無法訪問其他堆棧。 每個線程還有一個指向代碼的指針,指向它們當前正在運行的代碼位。當一個線程開始運行一個新方法時,它會將該方法中的參數和局部變量保存在自己的堆棧中。 其中一些值可能是指向堆上對象的指針。

最后,根據我的理解,只要類SuggestionBook不是垃圾收集,數據將保留在內存中。 將數據結構用作類變量而不是實例變量是一種正確的方法,因為它們會在較長時間內阻塞可用內存。

由於您正在使用servlet,因此在webapp的啟動時只創建一個servlet實例,並在所有請求之間共享。 靜態與否,每個類/實例變量將在所有請求/會話之間共享。 Servlet只有一個實例,實例變量就像一個靜態變量。 因此,不要求人們通過使變量靜態而不是實例來了解單個實例(因為許多人不知道),而是消除了使用中的任何混淆。 因此,變量的意圖更清晰,不太可能被誤解。 因此,可用性並不是一個糟糕的方法。

您可以將建議方法設置為同步 ,它將起作用。 因為只有第一個調用將填充樹中的數據,后續調用才會讀取它。

但是如果你同步suggest方法,那么調用建議的每個線程都將被同步,這是不必要的,因為第一個調用已經填滿了樹。

解決方案1)創建一個靜態塊並初始化該樹。 因此,只要加載類,就會初始化樹。

解決方案2)使“fillTernary”方法同步,並且在方法內部僅在未初始化樹時初始化樹,即if(isTernaryEmpty)。 請注意,兩種方法都需要if條件,以防止多個線程同時初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM