代码之家  ›  专栏  ›  技术社区  ›  Sudhakar

JSP标记类中的同步块

  •  1
  • Sudhakar  · 技术社区  · 16 年前

    在过去的几天里,我试图找到以下问题的答案,但找不到全面的答案

    问题陈述

    我有一个自定义的JSP标记类,它处理Web表单提交、捕获数据并将其写入文件系统中的同一个文件。 和所有Web应用程序一样,这可以同时触发,我担心多个线程将在处理每个提交的过程中起作用(我们都知道servlet是如何工作的)。

    代码

                            synchronized (this){
                            final String reportFileName = "testReport.csv";
                            File reportDir = new File( rootCsDirectory, "reports" );
                            if(!reportDir.isDirectory())reportDir.mkdir();                          
                            File reportFile = new File (reportDir, reportFileName);
                            logReport(reportFile,reportContent.toString());
                            }
    

    问题: -一个线程可以打开一个文件对象进行写入,同时另一个线程可能试图访问并失败并引发异常。 所以我想同步(在对象上)应该可以解决这个问题,但是读一些在哪里 JSP引擎将具有JSP标记对象池 ,所以我担心 已同步(此) 不起作用,应该改成 已同步(this.getClass()) FY: 上面的代码放在JSP自定义标记类中。

    编辑:

    问题1: 代码块是否应通过 已同步(此) 已同步(this.getClass())

    问题2: 如果Web应用程序部署在集群环境中,将如何处理相同的场景?

    3 回复  |  直到 16 年前
        1
  •  1
  •   Brian Agnew    16 年前

    我将在一个更精细的级别上进行同步,并选择一个与文件创建更紧密地联系在一起的对象。

    例如,将上述内容抽象为 FileManager 类,并让 单一的 在锁定对象上同步的实例(内部保存到 文件管理器 -它可能会锁定自己)。

    这样,您就可以更好地控制同步,并且可以更好地控制锁定的对象。它们不受servlet/web容器控制。

        2
  •  0
  •   Brian    16 年前

    把它放在同步方法中,这样您就可以愉快地忽略JSP是如何管理的细节了,怎么样?

        3
  •  0
  •   Peter Tillemans    16 年前

    我将检查java.util.concurrent包中的内容。

    您可以使用CUNCurrent队列推送更新,并在另一端有一个线程,该线程是在应用程序启动时生成的,该线程执行对文件系统的写入操作。

    这将很好且有效地序列化对该文件的访问。