comparison src/EDU/oswego/cs/dl/util/concurrent/SynchronizedRef.java @ 0:3dc0c5604566

Initial checkin of blitz 2.0 fcs - no installer yet.
author Dan Creswell <dan.creswell@gmail.com>
date Sat, 21 Mar 2009 11:00:06 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:3dc0c5604566
1 /*
2 File: SynchronizedRef.java
3
4 Originally written by Doug Lea and released into the public domain.
5 This may be used for any purposes whatsoever without acknowledgment.
6 Thanks for the assistance and support of Sun Microsystems Labs,
7 and everyone contributing, testing, and using this code.
8
9 History:
10 Date Who What
11 11Jun1998 dl Create public version
12 */
13
14 package EDU.oswego.cs.dl.util.concurrent;
15 import java.io.*;
16
17 /**
18 * A simple class maintaining a single reference variable that
19 * is always accessed and updated under synchronization.
20 * <p>
21 * <p>[<a href="http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html"> Introduction to this package. </a>]
22 **/
23
24 public class SynchronizedRef extends SynchronizedVariable {
25 /** The maintained reference **/
26 protected Object value_;
27
28 /**
29 * Create a SynchronizedRef initially holding the given reference
30 * and using its own internal lock.
31 **/
32 public SynchronizedRef(Object initialValue) {
33 super();
34 value_ = initialValue;
35 }
36
37 /**
38 * Make a new SynchronizedRef with the given initial value,
39 * and using the supplied lock.
40 **/
41 public SynchronizedRef(Object initialValue, Object lock) {
42 super(lock);
43 value_ = initialValue;
44 }
45
46 /**
47 * Return the current value
48 **/
49 public final Object get() { synchronized(lock_) { return value_; } }
50
51 /**
52 * Set to newValue.
53 * @return the old value
54 **/
55
56 public Object set(Object newValue) {
57 synchronized (lock_) {
58 Object old = value_;
59 value_ = newValue;
60 return old;
61 }
62 }
63
64 /**
65 * Set value to newValue only if it is currently assumedValue.
66 * @return true if successful
67 **/
68 public boolean commit(Object assumedValue, Object newValue) {
69 synchronized(lock_) {
70 boolean success = (assumedValue == value_);
71 if (success) value_ = newValue;
72 return success;
73 }
74 }
75
76
77 /**
78 * Atomically swap values with another SynchronizedRef.
79 * Uses identityHashCode to avoid deadlock when
80 * two SynchronizedRefs attempt to simultaneously swap with each other.
81 * (Note: Ordering via identyHashCode is not strictly guaranteed
82 * by the language specification to return unique, orderable
83 * values, but in practice JVMs rely on them being unique.)
84 * @return the new value
85 **/
86
87 public Object swap(SynchronizedRef other) {
88 if (other == this) return get();
89 SynchronizedRef fst = this;
90 SynchronizedRef snd = other;
91 if (System.identityHashCode(fst) > System.identityHashCode(snd)) {
92 fst = other;
93 snd = this;
94 }
95 synchronized(fst.lock_) {
96 synchronized(snd.lock_) {
97 fst.set(snd.set(fst.get()));
98 return get();
99 }
100 }
101 }
102
103
104 }