gpt4 book ai didi

java - 读写锁

转载 作者:行者123 更新时间:2023-12-02 07:33:54 25 4
gpt4 key购买 nike

我有一个简单的网络应用程序,在其中使用 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();
}
}
...
}

但我有一个问题。我的老师说 lock-s 的最佳位置是操作类或命令(如果是简单的网络应用程序)

但是在 saveProducts 方法中,我在将新数据写入 xml 文件之前进行转换。这意味着如果在操作类中仅使用 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();
}
// /.....
}

如果在操作类中仅使用 writeLock,我是否会遇到在 xml 中写入不正确数据的情况?

最佳答案

所以,当然,您总是可以编写使用写锁的错误代码。但是,在使用锁保护数据时,如果您仅使用写锁(并且在所有适当的位置使用它们),那么您的数据将是安全的。这将产生与使用同步块(synchronized block)相同的性能。当您在适当的情况下使用读锁时,您可以获得更高的性能,但如果您尝试在仅具有读锁的区域中写入数据,则添加读锁的使用会增加潜在的错误。因此,只有写锁的安全性更高,但性能却较差。

关于java - 读写锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12712864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com