comparison src/EDU/oswego/cs/dl/util/concurrent/SynchronizedBoolean.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: SynchronizedBoolean.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 19Jun1998 dl Create public version
12 */
13
14 package EDU.oswego.cs.dl.util.concurrent;
15
16 /**
17 * A class useful for offloading synch for boolean instance variables.
18 *
19 * <p>[<a href="http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html"> Introduction to this package. </a>]
20 **/
21
22 public class SynchronizedBoolean extends SynchronizedVariable implements Comparable, Cloneable {
23 protected boolean value_;
24
25 /**
26 * Make a new SynchronizedBoolean with the given initial value,
27 * and using its own internal lock.
28 **/
29 public SynchronizedBoolean(boolean initialValue) {
30 super();
31 value_ = initialValue;
32 }
33
34 /**
35 * Make a new SynchronizedBoolean with the given initial value,
36 * and using the supplied lock.
37 **/
38 public SynchronizedBoolean(boolean initialValue, Object lock) {
39 super(lock);
40 value_ = initialValue;
41 }
42
43 /**
44 * Return the current value
45 **/
46 public final boolean get() { synchronized(lock_) { return value_; } }
47
48 /**
49 * Set to newValue.
50 * @return the old value
51 **/
52
53 public boolean set(boolean newValue) {
54 synchronized (lock_) {
55 boolean old = value_;
56 value_ = newValue;
57 return old;
58 }
59 }
60
61 /**
62 * Set value to newValue only if it is currently assumedValue.
63 * @return true if successful
64 **/
65 public boolean commit(boolean assumedValue, boolean newValue) {
66 synchronized(lock_) {
67 boolean success = (assumedValue == value_);
68 if (success) value_ = newValue;
69 return success;
70 }
71 }
72
73 /**
74 * Atomically swap values with another SynchronizedBoolean.
75 * Uses identityHashCode to avoid deadlock when
76 * two SynchronizedBooleans attempt to simultaneously swap with each other.
77 * (Note: Ordering via identyHashCode is not strictly guaranteed
78 * by the language specification to return unique, orderable
79 * values, but in practice JVMs rely on them being unique.)
80 * @return the new value
81 **/
82
83 public boolean swap(SynchronizedBoolean other) {
84 if (other == this) return get();
85 SynchronizedBoolean fst = this;
86 SynchronizedBoolean snd = other;
87 if (System.identityHashCode(fst) > System.identityHashCode(snd)) {
88 fst = other;
89 snd = this;
90 }
91 synchronized(fst.lock_) {
92 synchronized(snd.lock_) {
93 fst.set(snd.set(fst.get()));
94 return get();
95 }
96 }
97 }
98
99 /**
100 * Set the value to its complement
101 * @return the new value
102 **/
103 public boolean complement() {
104 synchronized (lock_) {
105 value_ = !value_;
106 return value_;
107 }
108 }
109
110 /**
111 * Set value to value &amp; b.
112 * @return the new value
113 **/
114 public boolean and(boolean b) {
115 synchronized (lock_) {
116 value_ = value_ & b;
117 return value_;
118 }
119 }
120
121 /**
122 * Set value to value | b.
123 * @return the new value
124 **/
125 public boolean or(boolean b) {
126 synchronized (lock_) {
127 value_ = value_ | b;
128 return value_;
129 }
130 }
131
132
133 /**
134 * Set value to value ^ b.
135 * @return the new value
136 **/
137 public boolean xor(boolean b) {
138 synchronized (lock_) {
139 value_ = value_ ^ b;
140 return value_;
141 }
142 }
143
144
145 public int compareTo(boolean other) {
146 boolean val = get();
147 return (val == other)? 0 : (val)? 1 : -1;
148 }
149
150 public int compareTo(SynchronizedBoolean other) {
151 return compareTo(other.get());
152 }
153
154 public int compareTo(Object other) {
155 return compareTo((SynchronizedBoolean)other);
156 }
157
158
159 public boolean equals(Object other) {
160 if (other != null &&
161 other instanceof SynchronizedBoolean)
162 return get() == ((SynchronizedBoolean)other).get();
163 else
164 return false;
165 }
166
167 public int hashCode() {
168 boolean b = get();
169 return (b)? 3412688 : 8319343; // entirely arbitrary
170 }
171
172 public String toString() { return String.valueOf(get()); }
173
174 }
175