Class ObjectLock

java.lang.Object
org.exolab.castor.persist.ObjectLock
All Implemented Interfaces:
DepositBox

public final class ObjectLock extends Object implements DepositBox
Read/write locks and lock synchronization on an object. Each object is required to have one ObjectLock which at any given time may be unlocked, write locked by one transaction, or read locked by one or more transactions.

In order to obtain a lock, the transaction must call one of the acquire, passing itself, the lock type and the lock timeout. The transaction must attempt to obtain only one lock at any given time by synchronizing all calls to one of the acquire. If the transaction has acquired a read lock it may attempt to re-acquire the read lock. If the transaction attempts to acquire a write lock the lock will be upgraded.

A read lock cannot be acquired while there is a write lock on the object, and a write lock cannot be acquired while there is one or more read locks. If a lock cannot be acquired, the transaction will hold until the lock is available or timeout occurs. If timeout occured (or a dead lock has been detected), LockNotGrantedException is thrown. If the object has been delete while waiting for the lock,

invalid reference
ObjectDeletedException
is thrown.

When the lock is acquired, the locked object is returned.

The transaction must call release(org.castor.persist.TransactionContext) when the lock is no longer required, allowing other transactions to obtain a lock. The transaction must release all references to the object prior to calling release(org.castor.persist.TransactionContext).

If the object has been deleted, the transaction must call delete(org.castor.persist.TransactionContext) instead of release(org.castor.persist.TransactionContext).

Version:
$Revision: 8294 $ $Date: 2006-04-25 15:08:23 -0600 (Tue, 25 Apr 2006) $
Author:
Assaf Arkin, Thomas Yip
See Also:
  • Field Details

  • Constructor Details

    • ObjectLock

      public ObjectLock(OID oid)
      Create a new lock for the specified object. Must not create two locks for the same object. This will be the object returned from a successful call to one of the acquire.
      Parameters:
      oid - The object to create a lock for
    • ObjectLock

      public ObjectLock(OID oid, Object[] object, long version)
  • Method Details

    • getOID

      public OID getOID()
      Return the object's OID.
      Specified by:
      getOID in interface DepositBox
      Returns:
      the object's OID.
    • setOID

      void setOID(OID oid)
      Set OID of this lock to new value.
    • enter

      void enter()
      Indicate that a transaction is interested in this lock. A transaction should call this method if it is going to change the state of this lock (by calling acquire, update or relase.) It method should be synchronized externally to avoid race condition. enter and leave should be called exactly the same number of time.
    • leave

      void leave()
      Indicate that a transaction is not interested to change the state of this lock anymore. (ie, will not call either acquire update, release or delete.) It method should be synchronized externally.
    • isEntered

      boolean isEntered()
      Return true if there is any transaction called enter(), but not yet called leave().
    • isDisposable

      boolean isDisposable()
      Return true if this object can be safely disposed. An ObjectLock can be safely disposed if and only if the no transaction is holding any lock, nor any transaction isEntered.
    • hasLock

      boolean hasLock(TransactionContext tx, boolean write)
      Returns true if the transaction holds a read or write lock on the object. This method is an efficient mean to determine whether a lock is required, or if the object is owned by the transaction.
      Parameters:
      tx - The transaction
      write - True if must have a write lock
      Returns:
      True if the transaction has a lock on this object
    • isFree

      boolean isFree()
      Return true if and only if this lock can be safely disposed.
      Returns:
      True if no lock and no waiting.
    • isExclusivelyOwned

      boolean isExclusivelyOwned(TransactionContext tx)
    • isExpired

      boolean isExpired()
      Return true if this entry has been expired from the cache.
    • getObject

      public Object[] getObject()
    • expire

      public void expire()
      Indicate that object needs to be expired from the cache.
    • expired

      public void expired()
      Indicate that object has been removed from the cache. Perform any post expiration cleanup. In particular, remove the reference to any saved cached objects.
    • acquireLoadLock

      void acquireLoadLock(TransactionContext tx, boolean write, int timeout) throws LockNotGrantedException
      Throws:
      LockNotGrantedException
    • acquireCreateLock

      void acquireCreateLock(TransactionContext tx) throws LockNotGrantedException
      Throws:
      LockNotGrantedException
    • acquireUpdateLock

      void acquireUpdateLock(TransactionContext tx, int timeout) throws LockNotGrantedException
      Throws:
      LockNotGrantedException
    • setObject

      public void setObject(TransactionContext tx, Object[] object, long version)
      Description copied from interface: DepositBox
      Set an object into the DespositBox, only a transaction has the write lock may call it method or IllegalArgumentException will be thrown.
      Specified by:
      setObject in interface DepositBox
      Parameters:
      tx - the transaction in action
      object - to be store into deposit box
      version - of the object to be stored
    • getObject

      public Object[] getObject(TransactionContext tx)
      Description copied from interface: DepositBox
      Get the object from the DespositBox, only the transaction have the read or write lock can get it.
      Specified by:
      getObject in interface DepositBox
      Parameters:
      tx - the transaction in action
      Returns:
      An object instance.
    • getVersion

      public long getVersion()
      Specified by:
      getVersion in interface DepositBox
      Returns:
      the version (a timestamp) of the last setObject(object) call.
    • setVersion

      public void setVersion(long version)
      Description copied from interface: DepositBox
      Sets the new version of this object.
      Specified by:
      setVersion in interface DepositBox
      Parameters:
      version - a timestamp.
    • confirm

      void confirm(TransactionContext tx, boolean succeed)
    • upgrade

      void upgrade(TransactionContext tx, int timeout) throws LockNotGrantedException
      Acquires a lock on the object on behalf of the specified transaction. A write lock will be acquired only if there are no read/write locks on the object; only one write lock may be in effect. A read lock will be acquired only if there is no write lock on the object; multiple read locks are allowed. If the lock cannot be acquired immediately, the thread will block until the lock is made available or the timeout has elapsed. If the timeout has elapsed or a dead lock has been detected, a LockNotGrantedException is thrown. If the object has been deleted while waiting for a lock, a
      invalid reference
      ObjectDeletedException
      is thrown. To prevent dead locks, a transaction must only call this method for any given object from a single thread and must mark the lock it is trying to acquire and return it from a call to TransactionContext.getWaitOnLock() if the call to this method has not returned yet. If a read lock is available for the transaction and a write lock is requested, the read lock is cancelled whether or not the write is acquired.
      Parameters:
      tx - The transaction requesting the lock
      timeout - Timeout waiting to acquire lock (in milliseconds), zero for no waiting
      Throws:
      LockNotGrantedException - Lock could not be granted in the specified timeout or a dead lock has been detected
      ObjectDeletedWaitingForLockException - The object has been deleted while waiting for the lock
    • release

      void release(TransactionContext tx)
      Releases a lock on the object previously acquired. A write lock cannot be downgraded into a read lock and the transaction loses its lock on the object. Other transactions are allowed to acquire a read/write lock on the object.
      Parameters:
      tx - The transaction that holds the lock
    • delete

      void delete(TransactionContext tx)
      Informs the lock that the object has been deleted by the transaction holding the write lock. The lock on the object is released and all transactions waiting for a lock will terminate with an
      invalid reference
      ObjectDeletedException
      .
      Parameters:
      tx - The transaction that holds the lock
      Throws:
      RuntimeException - Attempt to delete object without acquiring a write lock
    • invalidate

      void invalidate(TransactionContext tx)
    • toString

      public String toString()
      Overrides:
      toString in class Object