Class InterProcessMutex

  • All Implemented Interfaces:
    InterProcessLock, Revocable<InterProcessMutex>

    public class InterProcessMutex
    extends java.lang.Object
    implements InterProcessLock, Revocable<InterProcessMutex>
    A re-entrant mutex that works across JVMs. Uses Zookeeper to hold the lock. All processes in all JVMs that use the same lock path will achieve an inter-process critical section. Further, this mutex is "fair" - each user will get the mutex in the order requested (from ZK's point of view)
    • Constructor Summary

      Constructors 
      Constructor Description
      InterProcessMutex​(org.apache.curator.framework.CuratorFramework client, java.lang.String path)  
      InterProcessMutex​(org.apache.curator.framework.CuratorFramework client, java.lang.String path, LockInternalsDriver driver)  
    • Constructor Detail

      • InterProcessMutex

        public InterProcessMutex​(org.apache.curator.framework.CuratorFramework client,
                                 java.lang.String path)
        Parameters:
        client - client
        path - the path to lock
      • InterProcessMutex

        public InterProcessMutex​(org.apache.curator.framework.CuratorFramework client,
                                 java.lang.String path,
                                 LockInternalsDriver driver)
        Parameters:
        client - client
        path - the path to lock
        driver - lock driver
    • Method Detail

      • acquire

        public void acquire()
                     throws java.lang.Exception
        Acquire the mutex - blocking until it's available. Note: the same thread can call acquire re-entrantly. Each call to acquire must be balanced by a call to release()
        Specified by:
        acquire in interface InterProcessLock
        Throws:
        java.lang.Exception - ZK errors, connection interruptions
      • acquire

        public boolean acquire​(long time,
                               java.util.concurrent.TimeUnit unit)
                        throws java.lang.Exception
        Acquire the mutex - blocks until it's available or the given time expires. Note: the same thread can call acquire re-entrantly. Each call to acquire that returns true must be balanced by a call to release()
        Specified by:
        acquire in interface InterProcessLock
        Parameters:
        time - time to wait
        unit - time unit
        Returns:
        true if the mutex was acquired, false if not
        Throws:
        java.lang.Exception - ZK errors, connection interruptions
      • isAcquiredInThisProcess

        public boolean isAcquiredInThisProcess()
        Returns true if the mutex is acquired by a thread in this JVM
        Specified by:
        isAcquiredInThisProcess in interface InterProcessLock
        Returns:
        true/false
      • release

        public void release()
                     throws java.lang.Exception
        Perform one release of the mutex if the calling thread is the same thread that acquired it. If the thread had made multiple calls to acquire, the mutex will still be held when this method returns.
        Specified by:
        release in interface InterProcessLock
        Throws:
        java.lang.Exception - ZK errors, interruptions, current thread does not own the lock
      • getParticipantNodes

        public java.util.Collection<java.lang.String> getParticipantNodes()
                                                                   throws java.lang.Exception
        Return a sorted list of all current nodes participating in the lock
        Returns:
        list of nodes
        Throws:
        java.lang.Exception - ZK errors, interruptions, etc.
      • makeRevocable

        public void makeRevocable​(RevocationListener<InterProcessMutex> listener,
                                  java.util.concurrent.Executor executor)
        Description copied from interface: Revocable
        Make the lock revocable. Your listener will get called when another process/thread wants you to release the lock. Revocation is cooperative.
        Specified by:
        makeRevocable in interface Revocable<InterProcessMutex>
        Parameters:
        listener - the listener
        executor - executor for the listener
      • isOwnedByCurrentThread

        public boolean isOwnedByCurrentThread()
        Returns true if the mutex is acquired by the calling thread
        Returns:
        true/false
      • getLockNodeBytes

        protected byte[] getLockNodeBytes()
      • getLockPath

        protected java.lang.String getLockPath()