Mercurial Hosting > nabble
view src/cachingfilter/Locker.java @ 21:aba8ed4c8a06
semiprivate
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sat, 13 Jun 2020 22:30:48 -0600 |
parents | 7ecd1a4ef557 |
children |
line wrap: on
line source
package cachingfilter; import java.util.Map; import java.util.HashMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public final class Locker<T> { private static class Tracker { final ReentrantLock lock = new ReentrantLock(); int waiters = 0; } private final Map<T,Tracker> map = new HashMap<T,Tracker>(); public void lock(T obj) { Tracker t; synchronized(map) { t = map.get(obj); if( t == null ) { t = new Tracker(); map.put(obj,t); } t.waiters++; } try { t.lock.lock(); } finally { synchronized(map) { t.waiters--; } } } public boolean unlock(T obj) { synchronized(map) { Tracker t = map.get(obj); if( t == null || !t.lock.isHeldByCurrentThread() ) return false; t.lock.unlock(); if( t.waiters==0 ) { map.remove(obj); } return true; } } }