我的 Web 应用程序的页眉中有一个搜索框,并使用自动完成功能帮助用户按作者姓名或书名查找书籍。在用户输入时,oninput()
函数通过 ajax
调用 servlet FindBooks
。 FindBooks
servlet 调用 SuggestionBook
类的静态方法 suggest()
,它返回匹配输入字符串的书籍数组。
FindBooks.java
JSONArray books = SuggestionBook.suggest(inputString);
out.print(books);
建议书.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
方法,以避免为应用程序的每个 session 加载数据。所以它只会被加载一次,然后可以被不同的 session 共享。但是由于静态方法只有一个副本,所有 session 都使用相同的 static
方法来获取数据。他们是否必须等待其他 session 正在使用该方法,或者它可以被所有 session 同时访问?如果是,是否会影响应用程序的性能。如果否,JVM 如何管理单个副本的并发访问?最后,根据我的理解,只要类 SuggestionBook
未被垃圾回收,数据就会保留在内存中。将数据结构用作类变量
而不是实例变量
是否是一种正确的方法,因为它们会阻塞可用内存更长时间。
最佳答案
Do they have to wait while some other session is using the method or it can be accessed simultaneously by all sessions ?
不,他们不必等待,是的,他们可以同时访问。
同时从多个 session 访问同一个对象可以是 问题,但不一定是。例如,如果两个 session 执行 在不改变其状态的情况下同时访问一个对象 美好的。如果他们确实改变了状态并且状态转换涉及不稳定 中间状态可能会出现问题。
如果两个线程同时运行同一个方法,它们的代码指针都将指向该方法,并且在它们的堆栈上都有自己的参数副本和局部变量。只有当它们栈上的东西指向堆上的相同对象时,它们才会相互干扰。
If Yes, does it affect the performance of the application. If No, how this concurrent access of a single copy is managed by JVM ?
Java 中的内存分为两种——堆和栈。堆是所有对象所在的地方,而栈是线程工作的地方。每个线程都有自己的堆栈,并且不能访问彼此的堆栈。每个线程还有一个指向代码的指针,该指针指向它们当前正在运行的代码位。当一个线程开始运行一个新方法时,它会将该方法中的参数和局部变量保存在自己的堆栈中。其中一些值可能是指向堆上对象的指针。
Lastly, as per my understanding data will stay in the memory as long as class SuggestionBook is not garbage collected. Is it a right approach to use data structures as class variables than instance variables, as they will block available memory for longer time.
由于您使用的是 servlet,因此 servlet 的单个实例仅在 webapp 启动时创建一次,并在所有请求之间共享。无论是否静态,每个类/实例变量都将在所有请求/ session 之间共享。 将只有一个 Servlet 实例,实例变量将像静态变量一样工作。因此,与其通过将变量设为静态而不是实例来要求人们了解单个实例(因为很多人不知道),它消除了使用中的任何混淆。因此,变量的意图更清晰,更不容易被误解。所以是的,就可用性而言,这不是一个坏方法。
关于java - 在 Java Web 应用程序中使用静态方法和变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27776678/