[英]Read and Write lock
我有一个简单的web应用程序,我使用struts和xslt转换。 在动作类中,如果我得到正确的数据,我会尝试调用方法“save”
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的最佳位置是动作类或命令(如果是简单的web-app)
但在saveProducts方法中,我在xml文件中写入新数据之前进行转换。 这意味着如果在action-class中只使用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
块相同的性能。 在适当的情况下使用读锁时,可以提高性能,但如果尝试在只有读锁定的区域中写入数据,则添加读锁的使用可能会增加错误。 因此,只有写锁等于更安全但性能更低。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.