同步 VS 条纹锁

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在这里使用一个简单的方法,但我正在添加示例代码以确保您理解我的问题。

Kay*_*man 6

同步已存在多年。我们现在拥有更高级的并发编程机制并不奇怪。

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

AConcurrentHashMap具有类似于条带的内部分区,但它仅适用于诸如put(). 使用显式,StripedLock您可以使更长的操作原子化,同时在操作未触及同一条带时仍允许并发。


And*_*w S -2

使用 aConcurrentHashMap这样您就不必自己进行任何同步。