- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
除了 Memcache 的以下用途外,我的 java 应用程序引擎项目不会在请求之间保留任何状态:
if (the memcache doesn't think a cleanup task is already running) schedule another cleanup task
)。我没有对任何对象的全局/静态引用,除了:
static ThreadLocal<User>
中目的。这意味着每个请求都将获得自己的用户副本,对吧?static DataCoordinator
中。对象。要使我的代码线程安全,我需要注意什么?我需要扔一个 synchronized
吗?我的 DataCoordinator
中每个方法声明中的关键字实现,因为多个线程可以访问它? ThreadLocal<User>
是真的吗? object 总是会做一个单独的 User
每个线程的对象,以便每个请求将分别进行身份验证?
我是线程安全思想的新手。我应该读什么?
感谢您的帮助,对于不够具体,我们深表歉意。
最佳答案
您应该知道的第一件事是应用引擎可以在多个服务器上复制您的应用程序。这意味着您的静态变量仅在一台服务器上是唯一的。因此,您的 DataCoordinator
将仅协调单个服务器上的数据访问。因此,如果您需要所有运行您应用程序的服务器的公共(public)数据,您应该始终为此使用数据存储(或在某些情况下使用 gae HTTP session 机制)。
关于DataCoordinator
的线程安全:如果这些方法不是以线程安全的方式实现的,您只需要同步该协调器的方法。例如,您不需要同步任何不访问任何实例/静态数据而只是从数据存储中获取数据的方法。如果方法访问可变的公共(public)实例/静态数据(也是同时写入的),在大多数情况下,您可以在访问数据的特殊监视器上同步,而不是在整个协调器上同步。
关于用于存储身份验证 token 的 ThreadLocal
:您可以这样做(例如,我在 gae 中为 GWT 请求工厂请求的用户身份验证这样做)是的,每个线程都有自己的变量只要您为该线程设置它的值。这意味着最好确保为每个线程都设置了变量,建议在设置后使用 try
-finally
-block 最终删除身份验证数据使用后。为什么?否则可能发生的最糟糕的事情是属于用户 B 的请求的线程仍然具有用户 A 的身份验证 token 。这是因为应用程序服务器中使用的线程通常在请求之间汇集在一起,而不是清理和重新创建。
关于内存缓存我不能说什么,因为我没有使用过它。
通常您必须知道,任何 Web 请求(servlet/JSP/...)都可以由服务器并发处理。因此,这些线程访问的任何可变共享资源都应该同步或以线程安全的方式实现。
也许 http://download.oracle.com/javase/tutorial/essential/concurrency/是阅读它的一个很好的起点。
关于java - appengine 上线程安全 java 的 list ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7948793/
我是一名优秀的程序员,十分优秀!