1

私の主な質問は、「次のコード のを本当に再確認する必要がありますか?」ということです。 次のコードは、ReadWriteLock を使用してキャッシュを実装する方法を示しています。

public class ReadWriteLockCache {
private Map<String, Object> cache = new HashMap<String, Object>();
private ReadWriteLock rwl = new ReentrantReadWriteLock();

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
}

public Object getData(String key) {
    rwl.readLock().lock();

    Object value = null;

    try {
        value = cache.get(key);

        if (value == null) {
            rwl.readLock().unlock(); //line1
            rwl.writeLock().lock(); //line2

            try {
                if (value == null) //line3
                 {
                    value = "aaaa"; // may get data from db
                                    //line5 put the data into cache.

                    cache.put(key, value);
                }
            } finally {
                rwl.writeLock().unlock();
            }

            rwl.readLock().lock();
        }
    } finally {
        rwl.readLock().unlock();
    }

    return value;
}

}

「line3」の値を再確認する必要があるかどうか

私が知っているように、値オブジェクトは、3 行目に実行されるときに null でなければなりません。これは、ローカル変数(null の場合) であり、メインの obj:ReadWriteLockCache の状態変数にすることはできないためです
。 実際にすべきことは、get メソッドを呼び出して、キーの値が他のスレッドによって格納されているかどうかを確認することです。

コードは次のようになります。

                    value = cache.get(key);
                if (value == null) //line3
                 {
                    value = "aaaa"; 
                    cache.put(key, value);
                }

誰でも助けることができますか?私は正しいですか? よくわかりません。

4

1 に答える 1