tecgraf.javautils.concurrent.locks
Class LockManager

java.lang.Object
  extended by tecgraf.javautils.concurrent.locks.LockManager

public class LockManager
extends Object

Classe responsável por gerenciar os locks sobre objetos compartilhados.

Os locks podem ser obtidos de duas formas:

Os pedidos de lock são adquiridos ou não de acordo com a política de acesso requisitada. As políticas atualmente aceitas são:

Opcionalmente, os pedidos de lock podem definir uma cadeia de dependência de locks sobre outros objetos da aplicação. Um lock sobre um determinado objeto somente pode ser obtido se os locks dependentes também o forem. Ver LockDependency.

Utiliza duas threads: uma para gerenciar as requisições de lock por timeout e uma outra para enviar os eventos aos listeners desse LockManager . As threads são iniciadas no momento da instanciação do LockManager e são finalizadas com a chamada ao método close().

Author:
Tecgraf PUC-Rio

Nested Class Summary
static class LockManager.ManagerType
          Define se o gerenciador aceita reentrância de pedidos de lock ou não
 
Field Summary
static int INFINITE_TIMEOUT
          Constante que representa a espera, sem timeout, por um lock de um objeto.
 
Constructor Summary
LockManager()
          Constrói o gerenciador de locks do tipo não reentrante
LockManager(LockManager.ManagerType managerType)
          Constrói o gerenciador de locks informando o tipo do gerenciador
LockManager(LockManager.ManagerType managerType, Logger logger)
          Constrói o gerenciador de locks que informa o tipo do gerenciador
LockManager(Logger logger)
          Constrói o gerenciador de locks do tipo não reentrante
 
Method Summary
 LockId acquireLock(LockPolicy lockPolicy, Object ownerKey, SharedAccessObject object, LockDependency... lockDependencies)
          Tentativa de aquisição do lock de um objeto passando as dependências que devem ser obtidas para que o lock seja obtido com sucesso.
 LockResult acquireLockWithResult(LockPolicy lockPolicy, Object ownerKey, SharedAccessObject object, LockDependency... lockDependencies)
          Tentativa de aquisição do lock de um objeto passando as dependências que devem ser obtidas para que o lock seja obtido com sucesso.
 void addLockListener(Class<?> theClass, LockListener listener)
          Listener para observar o estado de todos os locks de um determinado tipo de objeto
 void addLockListener(LockListener listener)
          Listener para observar o estado de todos os locks obtidos e liberados
 void addLockListener(Object object, LockListener listener)
          Listener para observar o estado de todos os locks de um determinado objeto
 void close()
          Método para fechar o gerenciador de locks
 void forceReleaseLock(SharedAccessObject objectLocked)
          Força a remoção dos locks de um objeto.
 Map<LockPolicy,Set<Object>> getLockOwnersKeys(SharedAccessObject objectToVerify, LockPolicy... policies)
          Retorna o conjunto de chaves de usuários detentores dos determinados tipos de locks sobre o objeto passados como parâmetro
 Logger getLogger()
          Recupera o logger utilizado
 LockManager.ManagerType getManagerType()
          Retorna o tipo de gerenciador
 boolean hasLock(LockPolicy policy, SharedAccessObject object, Object ownerKey)
          Verifica se usuário possui determinado tipo de lock de um objeto.
 LockPolicy hasLock(SharedAccessObject object, Object ownerKey)
          Retorna a política de lock mais alta que o usuário obtém sobre o objeto, se houver
 int releaseLock(LockId lockId)
          Remove o lock de um objeto.
 void removeLockListener(LockListener listener)
          Remove o listener de observação do estado de locks
 void setLogger(Logger theLogger)
          Determina o logger a ser utilizado
 void tryAcquireLock(LockPolicy lockPolicy, Object ownerKey, SharedAccessObject object, LockFuture future, long timeout, LockDependency... lockDependencies)
          Tenta obter um lock exclusivo para um objeto compartilhado.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

INFINITE_TIMEOUT

public static final int INFINITE_TIMEOUT
Constante que representa a espera, sem timeout, por um lock de um objeto.

See Also:
Constant Field Values
Constructor Detail

LockManager

public LockManager()
Constrói o gerenciador de locks do tipo não reentrante


LockManager

public LockManager(LockManager.ManagerType managerType)
Constrói o gerenciador de locks informando o tipo do gerenciador

Parameters:
managerType - o tipo do gerenciador

LockManager

public LockManager(Logger logger)
Constrói o gerenciador de locks do tipo não reentrante

Parameters:
logger - logger utilizado para mensagens do gerenciador de lock

LockManager

public LockManager(LockManager.ManagerType managerType,
                   Logger logger)
Constrói o gerenciador de locks que informa o tipo do gerenciador

Parameters:
managerType - o tipo do gerenciador
logger - logger utilizado para mensagens do gerenciador de lock
Method Detail

getManagerType

public LockManager.ManagerType getManagerType()
Retorna o tipo de gerenciador

Returns:
tipo do gerenciador

close

public void close()
Método para fechar o gerenciador de locks


getLogger

public Logger getLogger()
Recupera o logger utilizado

Returns:
o logger utilizado

setLogger

public void setLogger(Logger theLogger)
Determina o logger a ser utilizado

Parameters:
theLogger - o logger a ser utilizado

acquireLock

public LockId acquireLock(LockPolicy lockPolicy,
                          Object ownerKey,
                          SharedAccessObject object,
                          LockDependency... lockDependencies)
Tentativa de aquisição do lock de um objeto passando as dependências que devem ser obtidas para que o lock seja obtido com sucesso.

Parameters:
lockPolicy - política de lock
ownerKey - identificador do requisitante do lock
object - objeto referente à requisição de lock
lockDependencies - dependência do objeto solicitado
Returns:
identificador do lock, se o mesmo foi obtido com sucesso, ou null caso contrário

acquireLockWithResult

public LockResult acquireLockWithResult(LockPolicy lockPolicy,
                                        Object ownerKey,
                                        SharedAccessObject object,
                                        LockDependency... lockDependencies)
Tentativa de aquisição do lock de um objeto passando as dependências que devem ser obtidas para que o lock seja obtido com sucesso.

Caso o lock não seja obtido, retorno conterá um mapa com os identificadores dos donos dos locks existentes que são conflitantes com o lock solicitado sobre o objeto alvo.

Parameters:
lockPolicy - política de lock
ownerKey - identificador do requisitante do lock
object - objeto referente à requisição de lock
lockDependencies - dependência do objeto solicitado
Returns:
resultado da tentativa do lock, contendo identificador caso o mesmo foi obtido com sucesso, ou mapa com os identificadores dos donos dos locks existentes que são conflitantes com o lock solicitado sobre o objeto alvo.

tryAcquireLock

public void tryAcquireLock(LockPolicy lockPolicy,
                           Object ownerKey,
                           SharedAccessObject object,
                           LockFuture future,
                           long timeout,
                           LockDependency... lockDependencies)
Tenta obter um lock exclusivo para um objeto compartilhado. Caso este se encontre bloqueado, uma requisição é cadastrada na fila.

Parameters:
lockPolicy - política do lock solicitado
ownerKey - identificador do usuário
object - objeto referente à requisição do lock
future - observador a ser notificado quando o lock é obtido ou o timeout atingido
timeout - tempo de espera pelo lock
lockDependencies - dependências do lock requisitado

releaseLock

public int releaseLock(LockId lockId)
Remove o lock de um objeto. Quando o contador de locks para o objeto chegar a zero, remove o info de lock do objeto.

O lock só é removido se objeto estiver contido na lista de objetos com locks, e o identificador do lock é igual ao parâmetro lockId.

Parameters:
lockId -
Returns:
contagem de referências para o lock

forceReleaseLock

public void forceReleaseLock(SharedAccessObject objectLocked)
Força a remoção dos locks de um objeto. Só deve ser usado pelo administrador se acontencer alguma situação de ter locks "presos".

Parameters:
objectLocked - objeto sobre o qual se deseja remover o lock

hasLock

public boolean hasLock(LockPolicy policy,
                       SharedAccessObject object,
                       Object ownerKey)
Verifica se usuário possui determinado tipo de lock de um objeto. Caso o usuário possua um tipo de lock mais alto que o tipo a ser verificado o resultado é verdadeiro. Caso não possua nenhum lock ou possua um lock mais baixo que o tipo a ser verificado, o resultado é falso.

Parameters:
policy - a política a ser verificada
object - o objeto a ser verificado
ownerKey - a identificação do usuário
Returns:
se usuário possui determinado tipo de lock de um objeto

hasLock

public LockPolicy hasLock(SharedAccessObject object,
                          Object ownerKey)
Retorna a política de lock mais alta que o usuário obtém sobre o objeto, se houver

Parameters:
object - o objeto a ser verificado
ownerKey - a identificação do usuário
Returns:
a política deste lock mais alta, caso contrário retorna nulo

getLockOwnersKeys

public Map<LockPolicy,Set<Object>> getLockOwnersKeys(SharedAccessObject objectToVerify,
                                                     LockPolicy... policies)
Retorna o conjunto de chaves de usuários detentores dos determinados tipos de locks sobre o objeto passados como parâmetro

Parameters:
objectToVerify - objeto a ser verificado
policies - políticas de lock
Returns:
um mapa com a política e o conjunto de chaves de usuários detentores dos determinados tipos de locks

addLockListener

public void addLockListener(LockListener listener)
Listener para observar o estado de todos os locks obtidos e liberados

Parameters:
listener - observador utilizado para receber eventos

addLockListener

public void addLockListener(Class<?> theClass,
                            LockListener listener)
Listener para observar o estado de todos os locks de um determinado tipo de objeto

Parameters:
theClass - o tipo do objeto a ser observado
listener - observador utilizado para receber eventos

addLockListener

public void addLockListener(Object object,
                            LockListener listener)
Listener para observar o estado de todos os locks de um determinado objeto

Parameters:
object - o objeto a ser observado
listener - observador utilizado para receber eventos

removeLockListener

public void removeLockListener(LockListener listener)
Remove o listener de observação do estado de locks

Parameters:
listener - observador utilizado para receber eventos


Copyright © 2014 Tecgraf/PUC-Rio. All rights reserved.