簡體   English   中英

讀寫鎖定

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM