Package org.eclipse.aether.named.support
Class FileLockNamedLock
- java.lang.Object
-
- org.eclipse.aether.named.support.NamedLockSupport
-
- org.eclipse.aether.named.support.FileLockNamedLock
-
- All Implemented Interfaces:
java.lang.AutoCloseable,NamedLock
public final class FileLockNamedLock extends NamedLockSupport
Named lock that usesFileLock. An instance of this class is about ONE LOCK (one file) and is possibly used by multiple threads. Each thread (if properly coded re boxing) will try to obtain either shared or exclusive lock. As file locks are JVM-scoped (so one JVM can obtain same file lock only once), the threads share file lock and synchronize according to it. Still, as file lock obtain operation does not block (or in other words, the method that does block cannot be controlled for how long it blocks), we are "simulating" thread blocking usingRetryutility. This implementation performs coordination not only on thread (JVM-local) level, but also on process level, as long as other parties are using this same "advisory" locking mechanism.- Since:
- 1.7.3
-
-
Field Summary
Fields Modifier and Type Field Description private java.util.concurrent.locks.ReentrantLockcriticalRegionLock protecting "critical region": this is where threads are allowed to perform locking but should leave this region as quick as possible.private java.nio.channels.FileChannelfileChannelTheFileChannelthis instance is about.private java.util.concurrent.atomic.AtomicReference<java.nio.channels.FileLock>fileLockRefThe reference ofFileLock, if obtained.private static longLOCK_POSITIONprivate static longLOCK_SIZEprivate static longRETRY_SLEEP_MILLISprivate java.util.Map<java.lang.Thread,java.util.Deque<java.lang.Boolean>>threadStepsThread -> steps stack (true = shared, false = exclusive)-
Fields inherited from class org.eclipse.aether.named.support.NamedLockSupport
logger
-
-
Constructor Summary
Constructors Constructor Description FileLockNamedLock(java.lang.String name, java.nio.channels.FileChannel fileChannel, NamedLockFactorySupport factory)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private booleananyOtherThreadHasSteps()Returnstrueif any other than this thread using this instance has any step recorded.private java.lang.BooleandoLockExclusively()private java.lang.BooleandoLockShared()booleanlockExclusively(long time, java.util.concurrent.TimeUnit unit)Tries to lock exclusively, may block for given time.booleanlockShared(long time, java.util.concurrent.TimeUnit unit)Tries to lock shared, may block for given time.private java.nio.channels.FileLockobtainFileLock(boolean shared)Attempts to obtain realFileLock, returns non-null value is succeeds, ornullif cannot.voidunlock()Unlocks the lock, must be invoked by caller after one of theNamedLock.lockShared(long, TimeUnit)orNamedLock.lockExclusively(long, TimeUnit).-
Methods inherited from class org.eclipse.aether.named.support.NamedLockSupport
close, name
-
-
-
-
Field Detail
-
RETRY_SLEEP_MILLIS
private static final long RETRY_SLEEP_MILLIS
- See Also:
- Constant Field Values
-
LOCK_POSITION
private static final long LOCK_POSITION
- See Also:
- Constant Field Values
-
LOCK_SIZE
private static final long LOCK_SIZE
- See Also:
- Constant Field Values
-
threadSteps
private final java.util.Map<java.lang.Thread,java.util.Deque<java.lang.Boolean>> threadSteps
Thread -> steps stack (true = shared, false = exclusive)
-
fileChannel
private final java.nio.channels.FileChannel fileChannel
TheFileChannelthis instance is about.
-
fileLockRef
private final java.util.concurrent.atomic.AtomicReference<java.nio.channels.FileLock> fileLockRef
The reference ofFileLock, if obtained.
-
criticalRegion
private final java.util.concurrent.locks.ReentrantLock criticalRegion
Lock protecting "critical region": this is where threads are allowed to perform locking but should leave this region as quick as possible.
-
-
Constructor Detail
-
FileLockNamedLock
public FileLockNamedLock(java.lang.String name, java.nio.channels.FileChannel fileChannel, NamedLockFactorySupport factory)
-
-
Method Detail
-
lockShared
public boolean lockShared(long time, java.util.concurrent.TimeUnit unit) throws java.lang.InterruptedExceptionDescription copied from interface:NamedLockTries to lock shared, may block for given time. If successful, returnstrue.- Throws:
java.lang.InterruptedException
-
lockExclusively
public boolean lockExclusively(long time, java.util.concurrent.TimeUnit unit) throws java.lang.InterruptedExceptionDescription copied from interface:NamedLockTries to lock exclusively, may block for given time. If successful, returnstrue.- Throws:
java.lang.InterruptedException
-
doLockShared
private java.lang.Boolean doLockShared()
-
doLockExclusively
private java.lang.Boolean doLockExclusively()
-
unlock
public void unlock()
Description copied from interface:NamedLockUnlocks the lock, must be invoked by caller after one of theNamedLock.lockShared(long, TimeUnit)orNamedLock.lockExclusively(long, TimeUnit).
-
anyOtherThreadHasSteps
private boolean anyOtherThreadHasSteps()
Returnstrueif any other than this thread using this instance has any step recorded.
-
obtainFileLock
private java.nio.channels.FileLock obtainFileLock(boolean shared)
Attempts to obtain realFileLock, returns non-null value is succeeds, ornullif cannot.
-
-