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

Google app engine 在Google App Engine上部署时,在静态字段中存储数据是否线程安全?,google-app-engine,concurrency,static,thread-safety,thread-local,Google App Engine,Concurrency,Static,Thread Safety,Thread Local,我在浏览Google App Engine上托管的开源CMS的代码(我认为这是一个很棒的主意),我在课堂上偶然发现了以下代码: 我从未使用过GAE,但这听起来真的很奇怪 GAE真的是“单线程”吗?使用GAE时,将请求范围的数据存储在静态字段中是否安全 这是否意味着,对于每个JVM实例,一次只执行一个HTTP请求,而所有其他请求都在等待 这是一个常见的GAE成语吗?如果不是,在请求期间存储这样一个用户实体的最佳GAE习惯用法是什么?这里不应该像在SpringSecurity中那样使用Thread

我在浏览Google App Engine上托管的开源CMS的代码(我认为这是一个很棒的主意),我在课堂上偶然发现了以下代码:

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

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

  • 这是否意味着,对于每个JVM实例,一次只执行一个HTTP请求,而所有其他请求都在等待

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


目前,App Engine上的Java和Python运行时都是单线程的;您是正确的,这意味着每个JVM只执行一个HTTP请求,但同时启动多个JVM来处理多个传入请求

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

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

过去是这样(直到1.4.3),默认情况下仍然是这样

现在,然后您将收到对同一JVM/servlet的并发请求

这是否意味着,对于每个JVM实例,一次只执行一个HTTP请求,而所有其他请求都在等待

对于其他请求,您可能会得到另一个JVM。但这超出了你的控制范围。他们也可以等待

/**
 * 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;
        }
}