【问题标题】:Understanding thread safe in web applications了解 Web 应用程序中的线程安全
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-09-19
      • 2012-07-06
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      相关资源
      最近更新 更多