【发布时间】:2015-07-02 17:07:28
【问题描述】:
我对 java web 应用程序中的多线程有一个简要的了解(我知道 servlet 容器使用线程来为任何应用程序中的不同请求提供相同的 servlet)。
在我们的 java web 应用程序中,我们有几个 servlet 类。在一个 servlet 中我想使用这个类 BlobInputStream ,但是这个类的描述说它不是线程安全的。
在我的代码中,我没有明确地创建任何新线程,如果我在我的代码中使用这个类,我需要在我使用这个类的地方放置同步块。
更新
以下是我的 servlet 代码,我的 servlet 类中没有任何实例变量
@Override
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(req);
List<BlobKey> blobKeys = blobs.get("myfile");
BlobstoreInputStream inputStream = new BlobstoreInputStream(blobKeys.get(0));
//this class implementing Runnable interface
RunnableThread newThread = new RunnableThread(inputStream);
}
上述代码中关于线程安全的任何错误
【问题讨论】:
-
只有在需要处理
shared mutable对象时才需要担心线程安全。如果对象是局部变量,就像您在方法中声明的那样(或)如果对象是不可变的,那么您不必担心线程安全。 -
如果 same 数据结构在同一时隙中被访问,则多个线程需要同步块 - 这有帮助吗?
-
这取决于你如何使用
BlobInputStream。如果它是您的 servlet 类中的某个实例变量,那么您需要同步对它的访问,如果它是在您的 doGet/doPost 方法中创建的局部变量,那么这不是问题。
标签: java multithreading google-app-engine servlets