Wil*_*ill 7 java multithreading locking
我有一个由多个线程访问的类,我想确保它是线程安全的。此外,它需要尽可能快。这只是一个例子:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我StripedLock在一个版本中使用Google Guava,另一个版本使用的是普通版本synchronized。
我说番石榴版本应该更快吗?
如果是这样,什么是一个很好的用例synchronized,哪些地方StripedLocks不适合?
顺便说一句,我知道我可以ConcurrentHashMap在这里使用一个简单的方法,但我正在添加示例代码以确保您理解我的问题。
同步已存在多年。我们现在拥有更高级的并发编程机制并不奇怪。
然而,条带锁只有在某些东西可以被分区或条带化的情况下才有优势,例如锁定地图的一部分,允许同时操作不同的部分,但阻止对同一条带的同时操作。在许多情况下,您没有那种分区,您只是在寻找互斥锁。在这些情况下synchronized仍然是一个可行的选择,尽管ReadWriteLock根据情况a可能是更好的选择。
AConcurrentHashMap具有类似于条带的内部分区,但它仅适用于诸如put(). 使用显式,StripedLock您可以使更长的操作原子化,同时在操作未触及同一条带时仍允许并发。
| 归档时间: |
|
| 查看次数: |
4635 次 |
| 最近记录: |