package jp.aegif.nemaki.util.lock.impl; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import org.apache.commons.collections.CollectionUtils; import com.google.common.util.concurrent.Striped; import jp.aegif.nemaki.model.Content; import jp.aegif.nemaki.util.lock.ThreadLockService; import jp.aegif.nemaki.util.lock.UniqueObjectId; public class ThreadLockServiceImpl implements ThreadLockService{ private final Striped<ReadWriteLock> locks = Striped.lazyWeakReadWriteLock(4096); @Override public ReadWriteLock get(String repositoryId, String objectId) { ReadWriteLock lock = locks.get(new UniqueObjectId(repositoryId, objectId)); return lock; } @Override public Lock getWriteLock(String repositoryId, String objectId) { return get(repositoryId, objectId).writeLock(); } @Override public Lock getReadLock(String repositoryId, String objectId) { return get(repositoryId, objectId).readLock(); } @Override public <T extends Content> List<Lock> readLocks(String repositoryId, List<T> contents){ List<Lock> locks = new ArrayList<>(); if(CollectionUtils.isNotEmpty(contents)){ for(T content : contents){ Lock lock = getReadLock(repositoryId, content.getId()); locks.add(lock); } } return locks; } @Override public void bulkLock(List<Lock> locks){ for(Lock lock : locks){ lock.lock(); } } @Override public void bulkUnlock(List<Lock> locks){ for(Lock lock : locks){ lock.unlock(); } } }