[英]Jasper - ireport - java web application - datasource static method
[英]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.