我有一个由多个线程访问的类,我想确保它的线程安全。此外,它需要尽可能快。这只是一个例子:
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
,但我正在添加示例代码以确保您理解我的问题。
答案 0 :(得分:4)
同步已存在多年。我们现在拥有更先进的并发编程机制,这并不奇怪。
然而,条带锁只有在可以分区或条带的情况下才有利,例如锁定地图的某些部分,允许同时操作不同的部分,但阻止对同一条纹的同时操作。在许多情况下,您没有这种分区,您只需要寻找互斥锁。在这些情况下,synchronized
仍然是一个可行的选择,尽管ReadWriteLock
可能是更好的选择,具体取决于具体情况。
答案 1 :(得分:0)
让我这样说。假设您有一个类的1000个实例,并且有1000个线程试图访问这些实例。每个实例将为每个线程获取一个锁。因此1000个锁将导致巨大的内存消耗。在这种情况下,剥离的锁可能会派上用场。
但是在通常情况下,如果您有一个Singleton类,则可能不需要剥离锁,可以继续使用并使用synced关键字。
所以,我希望我回答何时使用。
答案 2 :(得分:-2)
使用ConcurrentHashMap
,这样您就不必进行任何自己的同步。