| java.lang.Object org.openide.util.Mutex
Mutex | final public class Mutex extends Object (Code) | | Read-many/write-one lock.
Allows control over resources that
can be read by several readers at once but only written by one writer.
It is guaranteed that if you are a writer you can also enter the
mutex as a reader. Conversely, if you are the only reader you
can enter the mutex as a writer, but you'll be warned because it is very
deadlock prone (two readers trying to get write access concurently).
If the mutex is used only by one thread, the thread can repeatedly
enter it as a writer or reader. So one thread can never deadlock itself,
whichever order operations are performed in.
There is no strategy to prevent starvation.
Even if there is a writer waiting to enter, another reader might enter
the section instead.
Examples of use:
Mutex m = new Mutex ();
// Grant write access, compute an integer and return it:
return (Integer)m.writeAccess (new Mutex.Action () {
public Object run () {
return new Integer (1);
}
});
// Obtain read access, do some computation, possibly throw an IOException:
try {
m.readAccess (new Mutex.ExceptionAction () {
public Object run () throws IOException {
if (...) throw new IOException ();
return null;
}
});
} catch (MutexException ex) {
throw (IOException)ex.getException ();
}
// check whether you are already in read access
if (m.isReadAccess ()) {
// do your work
}
author: Ales Novak
|
Inner Class :public interface Action extends ExceptionAction<T> | |
Inner Class :public interface ExceptionAction | |
Inner Class :final public static class Privileged | |
Field Summary | |
final public static Mutex | EVENT Mutex that allows code to be synchronized with the AWT event dispatch thread. | static boolean | beStrict this is used from tests to prevent upgrade from readAccess to writeAccess
by strictly throwing exception. |
Constructor Summary | |
public | Mutex(Object lock) Enhanced constructor that permits specifying an object to use as a lock.
The lock is used on entry and exit to
Mutex.readAccess and during the
whole execution of
Mutex.writeAccess . | public | Mutex() Default constructor. | public | Mutex(Privileged privileged) | public | Mutex(Privileged privileged, Executor executor) Constructor for those who wish to do some custom additional tasks
whenever an action or runnable is executed in the
Mutex . |
Method Summary | |
static boolean | isDispatchThread() | public boolean | isReadAccess() Tests whether this thread has already entered the mutex in read access. | public boolean | isWriteAccess() Tests whether this thread has already entered the mutex in write access.
If it returns true, calling writeAccess will be executed
immediatelly without any other blocking. | public void | postReadRequest(Runnable run) Posts a read request. | public void | postWriteRequest(Runnable run) Posts a write request. | public T | readAccess(Action<T> action) Run an action only with read access.
See class description re. | public T | readAccess(ExceptionAction<T> action) Run an action with read access and possibly throw a checked exception.
The exception if thrown is then encapsulated
in a MutexException and thrown from this method. | public void | readAccess(Runnable action) Run an action with read access, returning no result. | public String | toString() | public T | writeAccess(Action<T> action) Run an action with write access. | public T | writeAccess(ExceptionAction<T> action) Run an action with write access and possibly throw an exception. | public void | writeAccess(Runnable action) Run an action with write access and return no result. |
EVENT | final public static Mutex EVENT(Code) | | Mutex that allows code to be synchronized with the AWT event dispatch thread.
When the Mutex methods are invoked on this mutex, the methods' semantics
change as follows:
|
beStrict | static boolean beStrict(Code) | | this is used from tests to prevent upgrade from readAccess to writeAccess
by strictly throwing exception. Otherwise we just notify that using ErrorManager.
|
Mutex | public Mutex(Object lock)(Code) | | Enhanced constructor that permits specifying an object to use as a lock.
The lock is used on entry and exit to
Mutex.readAccess and during the
whole execution of
Mutex.writeAccess . The ability to specify locks
allows several Mutex es to synchronize on one object or to synchronize
a mutex with another critical section.
Parameters: lock - lock to use |
Mutex | public Mutex()(Code) | | Default constructor.
|
Mutex | public Mutex(Privileged privileged)(Code) | | Parameters: privileged - can enter privileged states of this MutexThis helps avoid creating of custom Runnables. |
Mutex | public Mutex(Privileged privileged, Executor executor)(Code) | | Constructor for those who wish to do some custom additional tasks
whenever an action or runnable is executed in the
Mutex . This
may be useful for wrapping all the actions with custom
ThreadLocal value, etc. Just implement the
Executor 's execute(Runnable)
method and do pre and post initialization tasks before running the runnable.
The
Executor.execute method shall return only when the passed in
Runnable is finished, otherwise methods like
Mutex.readAccess(Action) and co.
might not return proper result.
Parameters: privileged - can enter privileged states of this Mutex Parameters: executor - allows to wrap the work of the mutex with a custom code since: 7.12 |
isDispatchThread | static boolean isDispatchThread()(Code) | | true iff current thread is EventDispatchThread |
isReadAccess | public boolean isReadAccess()(Code) | | Tests whether this thread has already entered the mutex in read access.
If it returns true, calling readAccess
will be executed immediatelly
without any blocking.
Calling postWriteAccess will delay the execution
of its Runnable until a readAccess section is over
and calling writeAccess is strongly prohibited and will
result in a warning as a deadlock prone behaviour.
Warning: since a thread with write access automatically
has effective read access as well (whether or not explicitly requested), if
you want to check whether a thread can read some data, you should check for
either kind of access, e.g.:
assert myMutex.isReadAccess() || myMutex.isWriteAccess();
true if the thread is in read access section since: 4.48 |
isWriteAccess | public boolean isWriteAccess()(Code) | | Tests whether this thread has already entered the mutex in write access.
If it returns true, calling writeAccess will be executed
immediatelly without any other blocking. postReadAccess
will be delayed until a write access runnable is over.
true if the thread is in write access section since: 4.48 |
postReadRequest | public void postReadRequest(Runnable run)(Code) | | Posts a read request. This request runs immediately iff
this Mutex is in the shared mode or this Mutex is not contended
at all.
This request is delayed if this Mutex is in the exclusive
mode and is held by this thread, until the exclusive is left.
Finally, this request blocks, if this Mutex is in the exclusive
mode and is held by another thread.
Warning: this method blocks.
Parameters: run - runnable to run |
postWriteRequest | public void postWriteRequest(Runnable run)(Code) | | Posts a write request. This request runs immediately iff
this Mutex is in the "pure" exclusive mode, i.e. this Mutex
is not reentered in shared mode after the exclusive mode
was acquired. Otherwise it is delayed until all read requests
are executed.
This request runs immediately if this Mutex is not contended at all.
This request blocks if this Mutex is in the shared mode.
Warning: this method blocks.
Parameters: run - runnable to run |
readAccess | public T readAccess(Action<T> action)(Code) | | Run an action only with read access.
See class description re. entering for write access within the dynamic scope.
Parameters: action - the action to perform the object returned from Mutex.Action.run |
readAccess | public T readAccess(ExceptionAction<T> action) throws MutexException(Code) | | Run an action with read access and possibly throw a checked exception.
The exception if thrown is then encapsulated
in a MutexException and thrown from this method. One is encouraged
to catch MutexException , obtain the inner exception, and rethrow it.
Here is an example:
try {
mutex.readAccess (new ExceptionAction () {
public void run () throws IOException {
throw new IOException ();
}
});
} catch (MutexException ex) {
throw (IOException) ex.getException ();
}
Note that runtime exceptions are always passed through, and neither
require this invocation style, nor are encapsulated.
Parameters: action - the action to execute the object returned from Mutex.ExceptionAction.run exception: MutexException - encapsulates a user exception exception: RuntimeException - if any runtime exception is thrown from the run method See Also: Mutex.readAccess(Mutex.Action)
|
readAccess | public void readAccess(Runnable action)(Code) | | Run an action with read access, returning no result.
It may be run asynchronously.
Parameters: action - the action to perform See Also: Mutex.readAccess(Mutex.Action) |
writeAccess | public T writeAccess(Action<T> action)(Code) | | Run an action with write access.
The same thread may meanwhile reenter the mutex; see the class description for details.
Parameters: action - the action to perform the result of Mutex.Action.run |
|
|