Guava Striped.get(key)是否同步?

时间:2015-10-01 05:58:41

标签: multithreading concurrency guava

我担心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();
    }
}

或者我是否需要同步我的方法来保护访问锁定地图?

2 个答案:

答案 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>