【问题标题】:Variables in GWT server side codeGWT 服务器端代码中的变量
【发布时间】:2012-03-15 18:07:21
【问题描述】:

我对 GWT 还很陌生,以前从未使用过 Java Servlet。我知道如何制作 RPC,但我想知道在我的 RPC 的 ServiceImpl/RemoteServiceServlet 类中声明成员变量是否存在任何并发问题。 IE。来自多个“同时”的 RPC 覆盖同一个变量,类似于未将变量声明为 volatile 时线程发生的情况。

我还需要在我的服务器端代码中使用一个额外的线程,所以我想知道将某些 servlet 的成员声明为静态以便其他线程可以访问是否存在任何问题(通常的线程安全问题之外)没有对 servlet 实例的引用的变量。是否可以同时运行同一个 RemoteServiceServlet 类的多个实例?

例如

public class MyServiceImpl extends RemoteServiceServlet implements MyService {

    // Which of these variable declarations are a bad idea in a servlet?
    private String someVariable;
    private static String anotherVariable;
    volatile private static String multiThreadedVariable;

    public void init() { ... }
    ...
}

谢谢。

【问题讨论】:

    标签: gwt variables servlets


    【解决方案1】:

    一个 Servlet 是一个单例,因此只有一个 MyServiceImpl 类的实例。通过引入这些状态变量,您将遇到线程安全问题,这并不是因为可能有多个 MyServiceImpl 实例,而是因为只有一个实例可以为您的所有请求提供服务。除非您同步对这些变量的访问,否则您将遇到线程安全问题,因此我建议完全删除它们(很可能您甚至不需要它们)。

    【讨论】:

    • 我明白了。不过,假设我需要它们 - 我将如何同步对它们的访问?与常规多线程应用程序一样,将变量声明为 volatile 或将同步关键字添加到 MyService 中的 RPC 方法?
    • 它与任何其他 java 应用程序没有什么不同。您可以同步使用该变量的方法,或同步代码块。在没有实际同步的情况下使用“volatile”(或其他任何东西)并不能解决您的线程安全问题。
    • public static synchronized changeMultiThreadedVariable() { do something here with multiThreadedVariable } 就是一个例子
    • 顺便说一句,任何类型的同步都会减慢您的应用程序,因此您应该考虑不使用状态变量。
    • 与任何其他 java 应用程序没有什么不同......很高兴知道。这可能不是问题。一些变量是磁盘上 XML 文件的缓存,因此它们仅在文件更改时才会更改。其他的只有在管理员登录 Web 应用程序并更改设置时才会更改,而且我不希望两个管理员同时进行更改。绝大多数请求只是读取缓存文件而不更改任何内容。不过,我会确保它的安全并同步访问。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多