/** * Constructor of IdReadWriteLock * @param referenceType type of the reference used in lock pool, {@link ReferenceType#WEAK} by * default. Use {@link ReferenceType#SOFT} if the key set is limited and the locks will * be reused with a high frequency */ public IdReadWriteLock(ReferenceType referenceType) { this.refType = referenceType; switch (referenceType) { case SOFT: lockPool = new SoftObjectPool<>(new ObjectPool.ObjectFactory<T, ReentrantReadWriteLock>() { @Override public ReentrantReadWriteLock createObject(T id) { return new ReentrantReadWriteLock(); } }, NB_CONCURRENT_LOCKS); break; case WEAK: default: lockPool = new WeakObjectPool<>(new ObjectPool.ObjectFactory<T, ReentrantReadWriteLock>() { @Override public ReentrantReadWriteLock createObject(T id) { return new ReentrantReadWriteLock(); } }, NB_CONCURRENT_LOCKS); } }
@VisibleForTesting public void waitForWaiters(long id, int numWaiters) throws InterruptedException { for (ReentrantReadWriteLock readWriteLock;;) { readWriteLock = lockPool.get(id); if (readWriteLock != null) { synchronized (readWriteLock) { if (readWriteLock.getQueueLength() >= numWaiters) { return; } } } Thread.sleep(50); } } }
/** * Acquire locks for a set of keys. The keys will be * sorted internally to avoid possible deadlock. * * @throws ClassCastException if the given {@code keys} * contains elements that are not mutually comparable */ public Map<K, Lock> acquireLocks(Set<? extends K> keys) { Object[] keyArray = keys.toArray(); Arrays.sort(keyArray); lockPool.purge(); Map<K, Lock> locks = new LinkedHashMap<>(keyArray.length); for (Object o : keyArray) { @SuppressWarnings("unchecked") K key = (K)o; ReentrantLock lock = lockPool.get(key); locks.put(key, lock); } for (Lock lock : locks.values()) { lock.lock(); } return locks; } }
@Before public void setUp() { pool = new WeakObjectPool<>( new ObjectPool.ObjectFactory<String, Object>() { @Override public Object createObject(String key) { return new Object(); } }); }
@Before public void setUp() { pool = new WeakObjectPool<>( new ObjectPool.ObjectFactory<String, Object>() { @Override public Object createObject(String key) { return new Object(); } }); }
@Before public void setUp() { pool = new WeakObjectPool<>( new ObjectPool.ObjectFactory<String, Object>() { @Override public Object createObject(String key) { return new Object(); } }); }
/** * Acquire locks for a set of keys. The keys will be * sorted internally to avoid possible deadlock. * * @throws ClassCastException if the given {@code keys} * contains elements that are not mutually comparable */ public Map<K, Lock> acquireLocks(Set<? extends K> keys) { Object[] keyArray = keys.toArray(); Arrays.sort(keyArray); lockPool.purge(); Map<K, Lock> locks = new LinkedHashMap<>(keyArray.length); for (Object o : keyArray) { @SuppressWarnings("unchecked") K key = (K)o; ReentrantLock lock = lockPool.get(key); locks.put(key, lock); } for (Lock lock : locks.values()) { lock.lock(); } return locks; } }
/** * Acquire locks for a set of keys. The keys will be * sorted internally to avoid possible deadlock. * * @throws ClassCastException if the given {@code keys} * contains elements that are not mutually comparable */ public Map<K, Lock> acquireLocks(Set<? extends K> keys) { Object[] keyArray = keys.toArray(); Arrays.sort(keyArray); lockPool.purge(); Map<K, Lock> locks = new LinkedHashMap<>(keyArray.length); for (Object o : keyArray) { @SuppressWarnings("unchecked") K key = (K)o; ReentrantLock lock = lockPool.get(key); locks.put(key, lock); } for (Lock lock : locks.values()) { lock.lock(); } return locks; } }
/** * Acquire locks for a set of keys. The keys will be * sorted internally to avoid possible deadlock. * * @throws ClassCastException if the given {@code keys} * contains elements that are not mutually comparable */ public Map<K, Lock> acquireLocks(Set<? extends K> keys) { Object[] keyArray = keys.toArray(); Arrays.sort(keyArray); lockPool.purge(); Map<K, Lock> locks = new LinkedHashMap<K, Lock>(keyArray.length); for (Object o : keyArray) { @SuppressWarnings("unchecked") K key = (K)o; ReentrantLock lock = lockPool.get(key); locks.put(key, lock); } for (Lock lock : locks.values()) { lock.lock(); } return locks; } }