【发布时间】:2015-06-02 00:12:01
【问题描述】:
当应用引擎旋转新实例时,我的静态变量会发生什么情况?更具体地说,我正在使用一个可以有 40 个实例/线程的任务队列。在有问题的 Servlet 中,我使用的是单例,如
public class WorkerThread extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
..
MySingleton single = MySingleton.getInstance();
..
}
...
}
这是单例的创建方式
public class MySingleton {
public static I MySingleton getInstance() {
return MySingletonHolder.INSTANCE;
}
private static class MySingletonHolder {
public static final MySingleton INSTANCE = new MySingleton();
}
private MySingleton() {
}
..
}
我有以下问题:
由于这是一个任务队列,我是否需要担心 App-Engine 会启动新实例以适应高需求扩展?
单例是 WorkerThread 类的内部类还是 WorkerThread 类正在访问的另一个类有关系吗?
任务队列实例是否独立? A 相信他们是,但不确定。
我希望问题很清楚。我希望在所有实例中只有一个我的单例实例。如果问题不清楚,请要求澄清。
更新
以下是我的确切用例
public class SingletonProductIndexWriter {
private static final Logger LOG = Logger.getLogger(SingletonProductIndexWriter.class.getName());
public static IndexWriter getSingleIndexWriter() {
return IndexWriterHolder.INDEX_WRITER;
}
private static class IndexWriterHolder {
static PorterAnalyzer analyzer = new PorterAnalyzer();
static GaeDirectory index = new GaeDirectory(LuceneWorker.PRODUCTS);// create product index
static IndexWriterConfig config = GaeLuceneUtil.getIndexWriterConfig(LuceneWorker.LUCENE_VERSION, analyzer);
public static final IndexWriter INDEX_WRITER = getIndexWriter();
private static IndexWriter getIndexWriter() {
try {
LOG.info("Create single index writer for workers");
return new IndexWriter(index, config);
}catch(IOException e){
return null;
}
}
}
}
称为
IndexWriter writer = SingletonProductIndexWriter.getSingleIndexWriter();
有关详细信息,请参阅堆栈溢出线程:Worker threads cause Lucene LockObtainFailedException
【问题讨论】:
标签: java multithreading google-app-engine singleton task-queue