了解 Web 应用程序中的线程安全

Understanding thread safe in web applications

我对 java 网络应用程序中的多线程有简要的了解(我知道 servlet 容器使用线程来为任何应用程序中的不同请求提供相同的 servlet)。

在我们的 java 网络应用程序中,我们有几个 servlet classes。在一个 servlet 中,我想使用这个 class BlobInputStream ,但是这个 class 的描述说它不是线程安全的。

在我的代码中,我没有明确地创建任何新线程,如果我在我的代码中使用这个 class,我是否需要在我使用这个 class 的地方放置同步块。

更新

以下是我的 servlet 代码,我的 servlet 中没有任何实例变量 class

 @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);
    }

以上代码中关于线程安全的任何错误

如果您不与其他线程共享该变量(例如,使其成为一个实例变量),您可以在没有同步的 servlet 中使用它

创建一个 BlobInputStream(作为局部变量)、读取数据并关闭它的 servlet 没有任何问题。

如果 BlobInputStream 是 servlet 的实例成员,并且由于它不是线程安全的,您将不得不使用 synchronize 关键字,但这同样取决于您使用此执行的操作 class.如果操作不更改任何资源的状态,则无需进行同步。

如果它是一个局部变量并且您没有使用任何静态方法(它修改对象的状态)那么您是安全的。无需使用 synchronize 关键字。