gpt4 book ai didi

java - 同步VS strip 锁

转载 作者:搜寻专家 更新时间:2023-11-01 03:17:52 25 4
gpt4 key购买 nike

我有一个被多个线程访问的类,我想确保它是线程安全的。另外,它需要尽可能快。这只是一个例子:

public class SharedClass {
private final Map<String, String> data = new HashMap<>();
private final Striped<ReadWriteLock> rwLockStripes = Striped.readWriteLock(100);

public void setSomethingFastVersion(String key, String value) {
ReadWriteLock rwLock = rwLockStripes.get(key);
try {
rwLock.lock();
} finally{
rwLock.unLock();
}

data.put(key, value);
}

public synchronized void setSomethingSlowVersion(String key, String value) {
data.put(key, value);
}
}

我在一个版本中使用 Google Guava 的 StripedLock,在另一个版本中使用普通的 synchronized

我说 Guava 版本应该更快是对的吗?

如果是这样,什么是 synchronized 的好用例,其中 StripedLocks 不适合?

顺便说一句,我知道我可以在这里使用一个简单的 ConcurrentHashMap,但我添加了示例代码以确保您理解我的问题。

最佳答案

同步已经存在了很长时间。我们现在拥有更先进的并发编程机制并不奇怪。

然而, strip 锁仅在某些东西可以分区或 strip 化的情况下才有优势,例如锁定 map 的部分允许同时操作不同部分,但阻止对同一 strip 的同时操作。在许多情况下,您没有那种分区,您只是在寻找互斥体。在这些情况下,synchronized 仍然是一个可行的选择,尽管根据情况,ReadWriteLock 可能是更好的选择。

ConcurrentHashMap 具有类似于 strip 的内部分区,但它仅适用于 map 操作,例如 put()。使用显式 StripedLock,您可以使较长的操作成为原子操作,同时在操作未触及相同 strip 时仍允许并发。

关于java - 同步VS strip 锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41988573/

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