gpt4 book ai didi

java - 使用 ReentrantReadWriteLock 和 boolean 标志

转载 作者:行者123 更新时间:2023-12-02 00:48:02 24 4
gpt4 key购买 nike

我有一个缓存,它预先加载了大量数据(通过后台线程),并且在满之前不可用(它也会经常重新加载,并且在加载期间不可用)。我希望使用它的类在访问之前检查标志 isLoaded() 。我使用 ReentrantReadWriteLock(为了简单起见,我在代码中省略了它)进行如下访问控制:

public class Cache {

private volatile boolean loaded = false; //starts false

private static String[] cache;

private static Lock readLock;
private static Lock writeLock;

public Object get(Object key) {
if (!readLock.tryLock()) throw IllegalStateException(...);
try {
... do some work
} finally {
readLock.unlock();
}
}

// called by background thread
private void loadFull() {
loaded = false;
writeLock.lock()
try {
cache = new String[];
... fill cache
} finally {
writeLock.unlock();
loaded = true;
}
}
....
}

现在在我的另一个类(class)中,我有一个像这样的 block :

if (cache.isLoaded()) {
try {
Object x = cache.get(y);
} catch (IllegalStateException iex) {
// goto database for object
}
} else {
// goto database for object
}

我真的需要try/catch吗?是否有可能该标志被设置为 false 并且 readLock try() 将失败?我是否应该打扰该标志并捕获异常(因为如果抛出异常,就像标志为假一样,我基本上会执行相同的代码)。我只是觉得我做的事情有点不对劲,但又说不出来。谢谢。

最佳答案

Do I really need the try/catch? Is it ever possible that the flag will be set to false and the readLock try() will fail?

是的,你需要它。在调用 cache.isLoaded()cache.get() 之间,写入者可以进入并获取写锁 - 在这种情况下 cache. isLoaded() 将返回 true,但 cache.get() 将抛出异常。

Should I even bother with the flag and jut catch the Exception (since I basically do the same code if the Exception is thrown as if the flag is false).

从您显示的代码来看,仅在 get 无法获取读锁的情况下才会引发异常。仅当当时有并发写入时,获取读锁才会失败。在这种情况下,isLoaded 也会返回 false。所以仅仅依赖异常就足够了。另外,请考虑创建一个专门的CacheStaleException

关于java - 使用 ReentrantReadWriteLock 和 boolean 标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4380216/

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