[jbosscache-commits] JBoss Cache SVN: r7920 - core/trunk/src/main/java/org/jboss/cache/util/concurrent/locks.
jbosscache-commits at lists.jboss.org
jbosscache-commits at lists.jboss.org
Thu Mar 19 05:59:50 EDT 2009
Author: manik.surtani at jboss.com
Date: 2009-03-19 05:59:50 -0400 (Thu, 19 Mar 2009)
New Revision: 7920
Modified:
core/trunk/src/main/java/org/jboss/cache/util/concurrent/locks/PerElementLockContainer.java
Log:
JBCACHE-1494 - better impl
Modified: core/trunk/src/main/java/org/jboss/cache/util/concurrent/locks/PerElementLockContainer.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/util/concurrent/locks/PerElementLockContainer.java 2009-03-19 08:35:15 UTC (rev 7919)
+++ core/trunk/src/main/java/org/jboss/cache/util/concurrent/locks/PerElementLockContainer.java 2009-03-19 09:59:50 UTC (rev 7920)
@@ -17,9 +17,10 @@
protected abstract Lock newLock();
- public Lock getLock(E object)
+ public final Lock getLock(E object)
{
- Lock l = newLock();
+ Lock l = locks.get(object);
+ if (l == null) l = newLock();
Lock tmp = locks.putIfAbsent(object, l);
if (tmp != null) l = tmp;
return l;
@@ -53,30 +54,51 @@
public void acquireLock(E object)
{
- Lock l = getLock(object);
- l.lock();
- // now check that the lock is still valid...
- if (l != locks.get(object))
+ while (true)
{
- // we acquired the wrong lock!
- l.unlock();
- acquireLock(object);
+ Lock lock = getLock(object);
+ lock.lock();
+ // now check that the lock is still valid...
+ Lock currentLock = locks.putIfAbsent(object, lock);
+ if (currentLock != null && lock != currentLock)
+ {
+ // we acquired the wrong lock!
+ lock.unlock();
+ }
+ else
+ {
+ // we got the right lock!
+ break;
+ }
}
}
public boolean acquireLock(E object, long timeout, TimeUnit unit) throws InterruptedException
{
- Lock l = getLock(object);
- boolean result = l.tryLock(timeout, unit);
-
- // now check that the lock is still valid...
- if (result && l != locks.get(object))
+ while (true)
{
- // we acquired the wrong lock!
- l.unlock();
- result = acquireLock(object, timeout, unit);
+ Lock lock = getLock(object);
+ if (lock.tryLock(timeout, unit))
+ {
+ // now check that the lock is still valid...
+ Lock currentLock = locks.putIfAbsent(object, lock);
+ if (currentLock != null && lock != currentLock)
+ {
+ // we acquired the wrong lock!
+ lock.unlock();
+ }
+ else
+ {
+ // we got the right lock!
+ return true;
+ }
+ }
+ else
+ {
+ // if we haven't acquired the lock (i.e., timed out) return false
+ return false;
+ }
}
- return result;
}
public void releaseLock(E object)
More information about the jbosscache-commits
mailing list