我担心Guava Striped.get(key)方法是否同步。
这个类线程安全吗?
class UrlLocker {
Striped<Lock> locks = Striped.lazyWeakLock(1);
public void lock(Url url) {
locks.get(url).lock();
}
public void unlock(Url url) {
locks.get(url).unlock();
}
}
或者我是否需要同步我的方法来保护访问锁定地图?
答案 0 :(得分:1)
要使其完全线程安全,您需要将locks
实例声明为final
:
class UrlLocker {
final Striped<Lock> locks = Striped.lazyWeakLock(1);
public void lock(Url url) {
locks.get(url).lock();
}
public void unlock(Url url) {
locks.get(url).unlock();
}
}
此外,代码的正确性取决于#hashcode
类本身的Url
实现。如果你使用java.net.URL
(它看起来不像你那样),如果你的internet connection松散,如果DNS解析在调用之间发生变化,那么哈希码就会改变。
摘自Striped
javadoc:
...假设{@link Object#hashCode()}正确实现了 键...
答案 1 :(得分:0)
深入了解guava MapMaker实现,我发现com.google.common.collect.ComputingConcurrentHashMap.ComputingSegment#getOrCompu te方法的神奇之处在于它可以保护计算Lock并放入Map的关键部分。< / p>