| 
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||
java.lang.Objectorg.logicalcobwebs.concurrent.SynchronizedVariable
public class SynchronizedVariable
Base class for simple, small classes maintaining single values that are always accessed and updated under synchronization. Since defining them for only some types seemed too arbitrary, they exist for all basic types, although it is hard to imagine uses for some.
These classes mainly exist so that you do not have to go to the trouble of writing your own miscellaneous classes and methods in situations including:
final. This
    helps avoid the need to synchronize just to obtain the reference
    to the synchronized variable itself.
    static variables. It almost
    always works out better to rely on synchronization internal
    to these objects, rather  than class locks.
  While they cannot, by nature, share much code, all of these classes work in the same way.
 Construction 
 Synchronized variables are always constructed holding an
 initial value of the associated type. Constructors also
 establish the lock to use for all methods:
 
 Update methods
 Each class supports several kinds of update methods:
 
set method that sets to a new value and returns
    previous value. For example, for a SynchronizedBoolean b,
    boolean old = b.set(true) performs a test-and-set.
 
commit method that sets to new value only
    if currently holding a given value.
 For example, here is a class that uses an optimistic update
 loop to recompute a count variable represented as a
 SynchronizedInt.
  
  class X {
    private final SynchronizedInt count = new SynchronizedInt(0);
    static final int MAX_RETRIES = 1000;
    public boolean recomputeCount() throws InterruptedException {
      for (int i = 0; i < MAX_RETRIES; ++i) {
        int current = count.get();
        int next = compute(current);
        if (count.commit(current, next))
          return true;
        else if (Thread.interrupted())
          throw new InterruptedException();
      }
      return false;
    }
    int compute(int l) { ... some kind of computation ...  }
  }
 
 
swap method that atomically swaps with another
    object of the same class using a deadlock-avoidance strategy.
 
 Guarded methods 
   All Waitable subclasses provide notifications on
   every value update, and support guarded methods of the form
   whenpredicate, that wait until the
   predicate hold,  then optionally run any Runnable action
   within the lock, and then return. All types support:
     
 Other methods 
   This class implements Executor, and provides an execute
   method that runs the runnable within the lock.
   
   All classes except SynchronizedRef and WaitableRef implement
   Cloneable and Comparable.
   Implementations of the corresponding
   methods either use default mechanics, or use methods that closely
   correspond to their java.lang analogs. SynchronizedRef does not
   implement any of these standard interfaces because there are
   many cases where it would not make sense. However, you can
   easily make simple subclasses that add the appropriate declarations.
  
[ Introduction to this package. ]
| Field Summary | |
|---|---|
protected  java.lang.Object | 
lock_
 | 
| Constructor Summary | |
|---|---|
SynchronizedVariable()
Create a SynchronizedVariable using itself as the lock  | 
|
SynchronizedVariable(java.lang.Object lock)
Create a SynchronizedVariable using the supplied lock  | 
|
| Method Summary | |
|---|---|
 void | 
execute(java.lang.Runnable command)
If current thread is not interrupted, execute the given command within this object's lock  | 
 java.lang.Object | 
getLock()
Return the lock used for all synchronization for this object  | 
| Methods inherited from class java.lang.Object | 
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | 
| Field Detail | 
|---|
protected final java.lang.Object lock_
| Constructor Detail | 
|---|
public SynchronizedVariable(java.lang.Object lock)
public SynchronizedVariable()
| Method Detail | 
|---|
public java.lang.Object getLock()
public void execute(java.lang.Runnable command)
             throws java.lang.InterruptedException
execute in interface Executorjava.lang.InterruptedException
  | 
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||