Первое, что вам следует знать, это то, что механизм приложений может реплицировать ваше приложение на нескольких серверах. Это означает, что ваши статические переменные будут уникальными только на одном сервере. Таким образом, ваш DataCoordinator
будет координировать только доступ к данным на одном сервере. Поэтому, если вам нужны общие данные для всех серверов, на которых работает ваше приложение, вы всегда должны использовать хранилище данных для этого (или механизм сеанса gae HTTP в некоторых случаях).
Относительно безопасности потока DataCoordinator
: Вам нужно синхронизировать методы этого координатора, только если эти методы не реализованы в поточно-ориентированном режиме. Например, вам не нужно синхронизировать какие-либо методы, которые не обращаются к каким-либо экземплярам / статическим данным, а просто извлекают данные из хранилища данных. Если методы обращаются к обычным экземплярам / статическим данным, которые являются изменяемыми (также записываются одновременно), вы можете синхронизировать на специальном мониторе для данных, к которым осуществляется доступ, в большинстве случаев вместо синхронизации по всему координатору.
Относительно вашего ThreadLocal
, используемого для хранения токена аутентификации: вы можете сделать это (я делаю это, например, для аутентификации пользователя в gae для запросов фабрики запросов GWT) и да, каждый поток будет иметь свое собственное значение переменной, пока вы установите его для этой темы. Это означает, что лучше всего убедиться, что переменная установлена для каждого потока, и после установки рекомендуется использовать try
- finally
-блок, который в конечном итоге удаляет данные аутентификации после использования. Зачем? В противном случае может случиться так, что поток, принадлежащий запросу пользователя B, по-прежнему имеет токен аутентификации пользователя A. Это связано с тем, что потоки, используемые на сервере приложений, обычно объединяются между запросами, а не очищаются и воссоздаются.
Я не могу ничего сказать о memcache, так как я не использовал его.
Как правило, вы должны знать, что любые веб-запросы (сервлет / JSP / ...) могут обрабатываться сервером одновременно. Поэтому любые изменяемые общие ресурсы, к которым получают доступ эти потоки, должны быть либо синхронизированы, либо реализованы безопасным для потоков образом.
Может быть, http://download.oracle.com/javase/tutorial/essential/concurrency/ - хорошая отправная точка для прочтения.