代码之家  ›  专栏  ›  技术社区  ›  Etienne Neveu

在Google App Engine上部署时,在静态字段中存储数据是否是线程安全的?

  •  3
  • Etienne Neveu  · 技术社区  · 14 年前

    我在浏览 Vosao CMS CurrentUser 班级:

    /**
     * Current user session value cache class. Due to GAE single-threaded nature
     * we can cache currently logged in user in static property. Which we set in 
     * authentication filter.
     */
    public class CurrentUser {
    
            private static UserEntity user;
    
            public static UserEntity getInstance2() {
                    return user;
            }
    
            public static void setInstance2(UserEntity aUser) {
                    user = aUser;
            }
    }
    

    我从来没用过GAE,但这听起来真的很奇怪。

    • GAE真的是“单线程”吗?使用GAE时,将请求范围的数据存储在静态字段中是否安全?

    • HTTP请求将一次执行,而所有其他请求都在等待?

    • 这是一个普通的同性恋成语吗?如果不是,那么在请求期间存储这样的用户实体的最佳GAE习惯用法是什么?难道不应该像在Spring Security中那样使用ThreadLocal吗?或者某种作用域bean(由依赖注入容器管理)?

    2 回复  |  直到 13 年前
        1
  •  4
  •   Thilo    14 年前

    GAE真的是“单线程”吗?使用GAE时,将请求范围的数据存储在静态字段中是否安全?

    现在, you can specify that your app is threadsafe ,然后您将收到对同一个JVM/servlet的并发请求。

    对于其他请求,您可能会得到另一个JVM。但那是你无法控制的。他们也可以等着。

        2
  •  4
  •   Nick Johnson    14 年前

    目前,应用程序引擎上的Java和Python运行时都是单线程的;这意味着每个JVM只执行一个HTTP请求是正确的,但是多个JVM将同时启动以处理多个传入请求。

    但是,这在将来的任何时候都可能发生变化——JavaServlet规范允许多线程。因此,您绝对应该使用ThreadLocal。

    推荐文章