java - 在 Java Web 应用程序中使用静态方法和变量

标签 java web-applications autocomplete static

我的 Web 应用程序的页眉中有一个搜索框,并使用自动完成功能帮助用户按作者姓名或书名查找书籍。在用户输入时,oninput() 函数通过 ajax 调用 servlet FindBooksFindBooks 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/

相关文章:

http - curl 不返回任何东西

javascript - 阻止 Chrome 在我的网站上自动建议信用卡号码

jquery - firefox 自动完成 'enter' 自动完成按键触发文本框输入

java mysql - 如何快速执行许多复杂的计算?

java - 解决并发问题的最佳方法

python - Django 可以扩展吗?

c# - 使用 safari 浏览器发布下载文件

autocomplete - Notepad++ 自动完成不适用于特定文件类型的自定义 xml

java - 将特定单元格宽度设置为 XSSF Apache POI 中的列

java - Spark 从 Blob 读取文本文件