读写锁

3

我有一个简单的Web应用程序,在其中使用Struts和XSLT转换。在动作类中,如果我得到正确的数据,我尝试调用“保存”方法。

public ActionForward saveProduct(ActionMapping mapping, ActionForm form, 
        HttpServletRequest request, HttpServletResponse response) throws XMLProductDAOException {
    // Validation
    if (sizeValidationErrorList == 0) {
        try {
            writeLock.lock();
            productDAO.saveProducts(document, product, categoryId, subcategoryId);
        } finally {
            writeLock.unlock();
        }
    }
        ...
}

但我有一个问题。我的老师说,在处理简单的Web应用程序时,最好将锁放在Action类或Command中。

但是,在saveProducts方法中,我在写入新数据到XML文件之前进行了转换。这意味着如果仅在Action类中使用writeLock,我将失去对正确数据的读取控制。

在XMLProductDAO中,我有如下内容:

public void saveProducts(Document document, Product product, Integer categoryId, Integer subcategoryId) throws XMLProductDAOException {
    // /......
    XSLTTransformer xsltTransformer = XSLTTransformer.getInstance();

    Transformer transformer = xsltTransformer.getCachedTransformer(NEW_PRODUCT_REAL_XSL_PATH);

    transformer.setParameter(PARAM_CURRENT_CATEGORY, currentCategory);
    transformer.setParameter(PARAM_CURRENT_SUBCATEGORY, currentSubcategory);
    transformer.setParameter(PARAM_PRODUCT, product);

    Writer result = new StringWriter();

    xsltTransformer.transform(transformer, result);

    File originalXML = new File(PRODUCT_REAL_XML_PATH);
    Writer fileWriter = null;
    try {
        fileWriter = new PrintWriter(originalXML, ENCODING);
        fileWriter.write(result.toString());
    } catch (IOException e) {
        logger.error(IO_EXCEPTION, e);
        throw new XMLProductDAOException(IO_EXCEPTION, e);
    } finally {
        fileWriter.close();
    }
    // /.....
}

如果只在Action类中使用writeLock,那么我是否有可能面临在XML文件中写入不正确的数据?


不清楚你为什么需要锁。你想要防止什么? - JB Nizet
1
“你说的意思是如果只在action类中使用writeLock,那么我会失去读取正确数据的控制权?” 写锁从定义上来说包含了读锁(有点像)。如果你拥有写锁,那么你可以安全地读取或写入被保护的数据。 - John B
@JB Nizet 我试图锁定对 XML 文件的访问,因为我使用 XSLT 转换添加数据,然后覆盖 XML 文件的内容。 - Ray
我知道writeLock(独占锁)。我想自己检查一下。 - Ray
1个回答

0

当然,你总是可以编写使用写锁的错误代码。但是,如果你只在适当的位置使用写锁来保护数据,那么你的数据将是安全的。这将导致与使用synchronized块相同的性能。当你在适当的位置使用读锁时,你会获得更好的性能,但是如果你尝试在仅具有读锁的区域中写入数据,则会增加出现错误的可能性。因此,仅使用写锁等于更安全但性能较低。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接