- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设这是一个“单例”实现:我能保证这只会调用 productCatalogLoader.load() 一次,并且不会发生空指针吗?有什么办法可以使这更简单吗?
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private ProductCatalog productCatalog;
public ProductCatalog get() {
if (this.productCatalog == null) {
reload();
}
return this.productCatalog;
}
public void reload() {
lock.writeLock().lock();
try {
if (this.productCatalog != null) return;
this.productCatalog = productCatalogLoader.load();
} finally {
lock.writeLock().unlock();
}
}
编辑:这是一次比较成功的尝试,将复杂得多的代码简化为一个简单的问题示例。有几个人发现我的单例太复杂了;)(实际上还有一个 quartz 计时器调用重新加载,但“重新加载”实现与 IRL 有点不同)。无论如何,我得到了我需要的答案,破坏了双重检查锁定。
最佳答案
简化它的最好方法,IMO,是使用“普通”锁,除非你真的有很好的证据表明它会导致瓶颈:
private final Object lock = new Object();
private ProductCatalog productCatalog;
public ProductCatalog get() {
synchronized (lock) {
if (this.productCatalog == null) {
this.productCatalog = productCatalogLoader.load();
}
return this.productCatalog;
}
}
在绝大多数情况下,这已经足够好了,您无需担心内存模型技术问题。
编辑:至于在不获取读锁的情况下读取写锁中更改的数据是否安全 - 我怀疑不安全,但我不想肯定地说。使用 volatile 变量使用普通(并且在 Java 1.5+ 上是安全的,如果你小心的话)双重检查锁定的方法有什么好处吗?
private final Object lock = new Object();
private volatile ProductCatalog productCatalog;
public ProductCatalog get() {
if (this.productCatalog == null) {
synchronized (lock) {
if (this.productCatalog == null) {
this.productCatalog = productCatalogLoader.load();
}
}
}
return this.productCatalog;
}
我相信这是 Effective Java 第 2 版中推荐的惰性初始化技术,适用于静态初始化器不够用的情况。请注意,productCatalog
必须是易变的才能使其正常工作 - 我认为这有效您没有取消代码中的读取锁定而错过了什么。
关于java - 在没有读锁的情况下使用 writeLock 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/775936/
如何在static方法上使用WriteLock?这就是我所得到的: m_unitLock = new ReentrantReadWriteLock(); m_unitReadLock = m_unit
目前我正在使用 WinDbg 分析转储。 我运行了以下命令(遵循 Tess' incredible walkthrough ): ~* e !clrstack 其中列出了所有线程的所有堆栈。有 300
http://winterbe.com/posts/2015/04/30/java8-concurrency-tutorial-synchronized-locks-examples/包含此代码: S
假设这是一个“单例”实现:我能保证这只会调用 productCatalogLoader.load() 一次,并且不会发生空指针吗?有什么办法可以使这更简单吗? private final Reentr
我研究了ReentrantReadWriteLock。 我编写了简单的测试代码(我知道使用 Thread.sleep() 不能保证可预测的结果,但我认为我很幸运:)): public class RW
考虑这个 JDK 标准接口(interface): public interface ReadWriteLock{ public Lock readLock(); public Loc
我知道的是: ReadLock和 WriteLock以某种方式相互影响 WriteLock 就像 同步的 ReadLock 似乎不能单独工作 最佳答案 readLock.lock(); 这意味着如果任
我读过 java 文档:ReentrantReadWriteLock 而且我没有看到 writeLock 比 readLock 有任何优先级 但我也读过这样的主题:Are read and write
我想做的是获取当前线程一次保存的readcounts数量。我为此编写了一个包装器,但我的问题是ReadLock()方法返回ReentrantReadWriteLock.WriteLock,所以我之后没
来自ReentrantReadWriteLock class javadoc : void processCachedData() { rwl.readLock().lock(); if (!
我正在使用 Java 6,并阅读了 Java Concurrency in Practice。我试图弄清楚在使用这些方法时,等待锁的 hibernate 线程是否在 hibernate 时使用任何 C
我是一名优秀的程序员,十分优秀!