在同步方法中使用 ReadWriteLock 是否有意义?
Does using ReadWriteLock inside a synchronized method make sense?
我们有一些实现缓存的代码。所有方法都有 synchronized
关键字,并且还在内部使用 ReadWriteLock
。简化示例:
private final ReadWriteLock _rwLock = new ReadWriteLock();
public synchronized void setItem(final UUID id, final Object someObjToCache) {
try {
_rwLock.writeLock().lock();
_innerCache.set(id, someObjToCache);
} finally {
_rwLock.writeLock().unlock();
}
}
public synchronized Object getItem(final UUID id) {
try {
_rwLock.readLock().lock();
return _innerCache.get(id);
} finally {
_rwLock.readLock().unlock();
}
}
同时使用这两种锁定技术有什么好处吗?我希望它是一个以读为主的缓存,所以我认为只使用 ReadWriteLock
就足够了。
只有当您需要同时锁定两个资源时,使用两个锁才有用。
我怀疑你只需要一把锁,而不是两把。如果您使用并发集合,则可能不需要。
final Map<UUID, Object> cache = new ConcurrentHashMap<>();
public void setItem(UUID id, Object obj) { cache.put(id, obj); }
public Object getItem(UUID id) { return cache.get(id); }
是的,ReadWriteLock
应该足够了。在这种情况下将它与 synchronized
一起使用没有多大意义:synchronized
意味着一次只有一个线程可以执行任何同步方法。
我们有一些实现缓存的代码。所有方法都有 synchronized
关键字,并且还在内部使用 ReadWriteLock
。简化示例:
private final ReadWriteLock _rwLock = new ReadWriteLock();
public synchronized void setItem(final UUID id, final Object someObjToCache) {
try {
_rwLock.writeLock().lock();
_innerCache.set(id, someObjToCache);
} finally {
_rwLock.writeLock().unlock();
}
}
public synchronized Object getItem(final UUID id) {
try {
_rwLock.readLock().lock();
return _innerCache.get(id);
} finally {
_rwLock.readLock().unlock();
}
}
同时使用这两种锁定技术有什么好处吗?我希望它是一个以读为主的缓存,所以我认为只使用 ReadWriteLock
就足够了。
只有当您需要同时锁定两个资源时,使用两个锁才有用。
我怀疑你只需要一把锁,而不是两把。如果您使用并发集合,则可能不需要。
final Map<UUID, Object> cache = new ConcurrentHashMap<>();
public void setItem(UUID id, Object obj) { cache.put(id, obj); }
public Object getItem(UUID id) { return cache.get(id); }
是的,ReadWriteLock
应该足够了。在这种情况下将它与 synchronized
一起使用没有多大意义:synchronized
意味着一次只有一个线程可以执行任何同步方法。