同步VS条纹锁

时间:2017-02-01 19:58:58

标签: 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);
  }
}

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

我说对了番石榴版本会更快吗?

如果是这样,那么synchronized不适合的StripedLocks会有什么好的用例?

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

3 个答案:

答案 0 :(得分:4)

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

然而,条带锁只有在可以分区或条带的情况下才有利,例如锁定地图的某些部分,允许同时操作不同的部分,但阻止对同一条纹的同时操作。在许多情况下,您没有这种分区,您只需要寻找互斥锁。在这些情况下,synchronized仍然是一个可行的选择,尽管ReadWriteLock可能是更好的选择,具体取决于具体情况。

答案 1 :(得分:0)

让我这样说。假设您有一个类的1000个实例,并且有1000个线程试图访问这些实例。每个实例将为每个线程获取一个锁。因此1000个锁将导致巨大的内存消耗。在这种情况下,剥离的锁可能会派上用场。

但是在通常情况下,如果您有一个Singleton类,则可能不需要剥离锁,可以继续使用并使用synced关键字。

所以,我希望我回答何时使用。

答案 2 :(得分:-2)

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