|
|||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object org.openide.util.Mutex
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
}
Nested Class Summary | |
static interface |
Mutex.Action
Action to be executed in a mutex without throwing any checked exceptions. |
static interface |
Mutex.ExceptionAction
Action to be executed in a mutex, possibly throwing checked exceptions. |
static class |
Mutex.Privileged
Provides access to Mutex's internal methods. |
Field Summary | |
static Mutex |
EVENT
Mutex that allows code to be synchronized with the AWT event dispatch thread. |
Constructor Summary | |
Mutex()
Default constructor. |
|
Mutex(Mutex.Privileged privileged)
|
|
Mutex(Object lock)
Enhanced constructor that permits specifying an object to use as a lock. |
Method Summary | |
boolean |
isReadAccess()
Tests whether this thread has already entered the mutex in read access. |
boolean |
isWriteAccess()
Tests whether this thread has already entered the mutex in write access. |
void |
postReadRequest(Runnable run)
Posts a read request. |
void |
postWriteRequest(Runnable run)
Posts a write request. |
Object |
readAccess(Mutex.Action action)
Run an action only with read access. |
Object |
readAccess(Mutex.ExceptionAction action)
Run an action with read access and possibly throw a checked exception. |
void |
readAccess(Runnable action)
Run an action with read access, returning no result. |
String |
toString()
toString |
Object |
writeAccess(Mutex.Action action)
Run an action with write access. |
Object |
writeAccess(Mutex.ExceptionAction action)
Run an action with write access and possibly throw an exception. |
void |
writeAccess(Runnable action)
Run an action with write access and return no result. |
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Field Detail |
public static final Mutex EVENT
When the Mutex methods are invoked on this mutex, the methods' semantics change as follows:
isReadAccess()
and isWriteAccess()
methods
return true
if the current thread is the event dispatch thread
and false otherwise.
postReadRequest(java.lang.Runnable)
and postWriteRequest(java.lang.Runnable)
methods
asynchronously execute the Runnable
passed in their
run
parameter on the event dispatch thead.
readAccess(java.lang.Runnable)
and
writeAccess(java.lang.Runnable)
methods asynchronously execute the
Runnable
passed in their run
parameter
on the event dispatch thread, unless the current thread is
the event dispatch thread, in which case
run.run()
is immediately executed.
readAccess(Mutex.Action)
,
readAccess(Mutex.ExceptionAction action)
,
writeAccess(Mutex.Action action)
and
writeAccess(Mutex.ExceptionAction action)
methods synchronously execute the Mutex.ExceptionAction
passed in their action
parameter on the event dispatch thread,
unless the current thread is the event dispatch thread, in which case
action.run()
is immediately executed.
Constructor Detail |
public Mutex(Object lock)
readAccess(org.openide.util.Mutex.Action)
and during the
whole execution of writeAccess(org.openide.util.Mutex.Action)
. The ability to specify locks
allows several Mutex
es to synchronize on one object or to synchronize
a mutex with another critical section.
lock
- lock to usepublic Mutex()
public Mutex(Mutex.Privileged privileged)
privileged
- can enter privileged states of this Mutex
This helps avoid creating of custom Runnables.Method Detail |
public Object readAccess(Mutex.Action action)
action
- the action to perform
Mutex.Action.run()
public Object readAccess(Mutex.ExceptionAction action) throws MutexException
MutexException
and thrown from this method. One is encouraged
to catch MutexException
, obtain the inner exception, and rethrow it.
Here is an example:
Note that runtime exceptions are always passed through, and neither
require this invocation style, nor are encapsulated.
try {
mutex.readAccess (new ExceptionAction () {
public void run () throws IOException {
throw new IOException ();
}
});
} catch (MutexException ex) {
throw (IOException) ex.getException ();
}
action
- the action to execute
Mutex.ExceptionAction.run()
MutexException
- encapsulates a user exception
RuntimeException
- if any runtime exception is thrown from the run methodreadAccess(Mutex.Action)
public void readAccess(Runnable action)
action
- the action to performreadAccess(Mutex.Action)
public Object writeAccess(Mutex.Action action)
action
- the action to perform
Mutex.Action.run()
public Object writeAccess(Mutex.ExceptionAction action) throws MutexException
try {
mutex.writeAccess (new ExceptionAction () {
public void run () throws IOException {
throw new IOException ();
}
});
} catch (MutexException ex) {
throw (IOException) ex.getException ();
}
action
- the action to execute
Mutex.ExceptionAction.run()
MutexException
- an encapsulated checked exception, if any
RuntimeException
- if a runtime exception is thrown in the actionwriteAccess(Mutex.Action)
,
readAccess(Mutex.ExceptionAction)
public void writeAccess(Runnable action)
action
- the action to performwriteAccess(Mutex.Action)
,
readAccess(Runnable)
public boolean isReadAccess()
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();
public boolean isWriteAccess()
writeAccess
will be executed
immediatelly without any other blocking. postReadAccess
will be delayed until a write access runnable is over.
public void postReadRequest(Runnable run)
Warning: this method blocks.
run
- runnable to runpublic void postWriteRequest(Runnable run)
Warning: this method blocks.
run
- runnable to runpublic String toString()
|
|||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |