在过去的几天里,我试图找到以下问题的答案,但找不到全面的答案
问题陈述
我有一个自定义 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)不起作用,应该改为 同步(this.getClass()) 仅供参考:上面的代码放在JSP自定义标签类中。
编辑:
问题1:代码块应该通过synchronized(this)还是synchronized( this.getClass ())来同步
问题2:如果Web应用程序部署在集群环境中,如何处理相同的场景?