O - The type of the objects to be locked (locked object type).L - The type of the objects that lock (lock owning type).public abstract class ObjectLockManager<O,L>
extends java.lang.Object
LockCountManager which allows to
flexibly change the equality of the locking objects. LockCountManager provided to the
constructor of this manager. This may treat various objects as equal
concerning locks (for instance object hierarchies) or not.
Lock upgrades and downgrades are impossible. When requesting a read lock while having a write the read lock will implicitly be granted as write lock. When releasing such a read lock, this will be implicitly a release of a write lock.
This class only provides the basic means, the real locking, lock creation and synchronisation has to be provided by subclasses. These may also whether they behave optimistically or pessimistically.
| Modifier and Type | Field and Description |
|---|---|
protected java.lang.Class<? extends LockCountManager<? super L>> |
lockCountManager
The lock count manager implementation which handles the lock counts per
lock.
|
protected java.lang.String |
lockType
The type of lock as informal string for user information.
|
protected java.util.logging.Logger |
logger
The logger for logging lock acquisitions and releasing - great for
debugging purpose.
|
| Modifier | Constructor and Description |
|---|---|
protected |
ObjectLockManager(java.lang.Class<? extends LockCountManager<? super L>> lockCountManager,
java.lang.String lockType,
java.util.logging.Logger logger)
Creates a new
ObjectLockManager with the designated lock count
manager providing the "equality" for the designated reentrant
locks and of the designated type. |
| Modifier and Type | Method and Description |
|---|---|
void |
getLockForObject(boolean writeLock,
L lockingObject,
O lockedObject)
Locks the designated object by the designated locking object.
|
void |
getLockForObject(boolean writeLock,
L lockingObject,
O lockedObject,
long timeout)
Locks the designated object by the designated locking object.
|
protected abstract void |
getLockForObjectReadWriteDirect(boolean writeLock,
L lockingObject,
O lockedObject,
long timeout)
Cf. documentation of
getLockForObject(boolean, Object, Object, long). |
protected abstract ReentrantLock<L> |
getObjectLock(O lockedObject)
Gets the lock for the designated object.
|
boolean |
hasLock(boolean writeLock,
L lockingObject,
O lockedObject)
Checks whether the designated object is locked for reading or writing by
the designated locking object.
|
boolean |
unlockObject(boolean writeLock,
L lockingObject,
O lockedObject)
Unlocks the designated object by the designated locking object.
|
protected final java.lang.Class<? extends LockCountManager<? super L>> lockCountManager
protected final java.lang.String lockType
protected final java.util.logging.Logger logger
protected ObjectLockManager(java.lang.Class<? extends LockCountManager<? super L>> lockCountManager, java.lang.String lockType, java.util.logging.Logger logger)
ObjectLockManager with the designated lock count
manager providing the "equality" for the designated reentrant
locks and of the designated type.lockCountManager - The lock count manager that encapsulates what
locking objects are treated as equal when acquiring a lock. The
provided class needs an accessible (public) constructor without
parameters.lockType - The type of locks managed by the created object. This is
for user information only.logger - The logger for log messages.protected abstract ReentrantLock<L> getObjectLock(O lockedObject)
lockedObject - The locked object for which to retrieve the
corresponding reentrant lock.null in case the designated object is not locked.public void getLockForObject(boolean writeLock,
L lockingObject,
O lockedObject)
throws java.lang.InterruptedException
Calls ObjectLockManager.getLockForObject(writeLock, lockingObject, lockedObject, 0).
writeLock - Whether to acquire a write lock.lockingObject - The object locking the designated object.lockedObject - The object to lock.java.lang.InterruptedException - If the thread is interrupted while waiting for
the lock, an InterruptedException will be thrown.java.lang.RuntimeException - If the provided lock count manager can not be
instantiated, a RuntimeException will be thrown.public final void getLockForObject(boolean writeLock,
L lockingObject,
O lockedObject,
long timeout)
throws java.lang.InterruptedException,
java.util.concurrent.TimeoutException
writeLock - Whether to acquire a write lock.lockingObject - The object locking the designated object.lockedObject - The object to lock.timeout - The time to wait for the lock. A timeout <= 0 means to wait
forever (or until the lock is granted).java.lang.InterruptedException - If the thread is interrupted while waiting for
the lock, an InterruptedException will be thrown.java.util.concurrent.TimeoutException - If the designated timeout elapsed before the lock
can be acquired, a TimeoutException will be thrown.java.lang.RuntimeException - If the provided lock or the lock count manager can
not be instantiated, a RuntimeException will be
thrown.protected abstract void getLockForObjectReadWriteDirect(boolean writeLock,
L lockingObject,
O lockedObject,
long timeout)
throws java.lang.InterruptedException,
java.util.concurrent.TimeoutException
getLockForObject(boolean, Object, Object, long). Implementors can
rely on the first boolean to be set appropriately depending on present
locks.writeLock - Whether to acquire a write lock. This will already be
adapted to a write lock if required, that is, requesting a read
lock while having the write lock already.lockingObject - The object locking the designated object.lockedObject - The object to lock.timeout - The time to wait for the lock. A timeout <= 0 means to wait
forever (or until the lock is granted).java.lang.InterruptedException - If the thread is interrupted while waiting for
the lock, an InterruptedException will be thrown.java.util.concurrent.TimeoutException - If the designated timeout elapsed before the lock
can be acquired, a TimeoutException will be thrown.java.lang.RuntimeException - If the provided lock or the lock count manager can
not be instantiated, a RuntimeException will be
thrown.public boolean hasLock(boolean writeLock,
L lockingObject,
O lockedObject)
writeLock - Whether the locking object is to be checked for having a
write lock on the designated locked object.lockingObject - The object to check for having the lock on the
designated object.lockedObject - The object to check for the lock lock.public boolean unlockObject(boolean writeLock,
L lockingObject,
O lockedObject)
throws LockException
LockException occurs while trying to unlock, the lock will
still be held when returning.writeLock - Whether to release the write lock.lockingObject - The object unlocking the designated object.lockedObject - The object to unlock.ReentrantLock.Lock.unlock(Object) and usually only
required by subclasses.LockException - If the locked object has not locked at all or not by
the designated locking object, a LockException will
be thrown.