Mercurial Hosting > nabble
view src/cachingfilter/Locker.java @ 58:41d76bd6268a
add doc for ssl
author | Vadim Filimonov <fffilimonov@yandex.ru> |
---|---|
date | Tue, 30 Nov 2021 09:32:14 +0200 |
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; } } }