ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/jsr166e/Fences.java
Revision: 1.1
Committed: Fri Nov 18 20:36:28 2016 UTC (7 years, 5 months ago) by dl
Branch: MAIN
CVS Tags: HEAD
Log Message:
Move never-released Fences

File Contents

# Content
1 /*
2 * Written by Doug Lea with assistance from members of JCP JSR-166
3 * Expert Group and released to the public domain, as explained at
4 * http://creativecommons.org/publicdomain/zero/1.0/
5 */
6
7 package jsr166e;
8
9 /**
10 * <b>This file exists for documentation reference but is not part of
11 * any planned release.</b>
12 *
13 * <p>A set of methods providing fine-grained control over happens-before
14 * and synchronization order relations among reads and/or writes. The
15 * methods of this class are designed for use in uncommon situations
16 * where declaring variables {@code volatile} or {@code final}, using
17 * instances of atomic classes, using {@code synchronized} blocks or
18 * methods, or using other synchronization facilities are not possible
19 * or do not provide the desired control.
20 *
21 * <p><b>Memory Ordering.</b> There are three methods for controlling
22 * ordering relations among memory accesses (i.e., reads and
23 * writes). Method {@code orderWrites} is typically used to enforce
24 * order between two writes, and {@code orderAccesses} between a write
25 * and a read. Method {@code orderReads} is used to enforce order
26 * between two reads with respect to other {@code orderWrites} and/or
27 * {@code orderAccesses} invocations. The formally specified
28 * properties of these methods described below provide
29 * platform-independent guarantees that are honored by all levels of a
30 * platform (compilers, systems, processors). The use of these
31 * methods may result in the suppression of otherwise valid compiler
32 * transformations and optimizations that could visibly violate the
33 * specified orderings, and may or may not entail the use of
34 * processor-level "memory barrier" instructions.
35 *
36 * <p>Each ordering method accepts a {@code ref} argument, and
37 * controls ordering among accesses with respect to this reference.
38 * Invocations must be placed <em>between</em> accesses performed in
39 * expression evaluations and assignment statements to control the
40 * orderings of prior versus subsequent accesses appearing in program
41 * order. These methods also return their arguments to simplify
42 * correct usage in these contexts.
43 *
44 * <p>Usages of ordering methods almost always take one of the forms
45 * illustrated in the examples below. These idioms arrange some of
46 * the ordering properties associated with {@code volatile} and
47 * related language-based constructions, but without other
48 * compile-time and runtime benefits that make language-based
49 * constructions far better choices when they are applicable. Usages
50 * should be restricted to the control of strictly internal
51 * implementation matters inside a class or package, and must either
52 * avoid or document any consequent violations of ordering or safety
53 * properties expected by users of a class employing them.
54 *
55 * <p><b>Reachability.</b> Method {@code reachabilityFence}
56 * establishes an ordering for strong reachability (as defined in the
57 * {@link java.lang.ref} package specification) with respect to
58 * garbage collection. Method {@code reachabilityFence} differs from
59 * the others in that it controls relations that are otherwise only
60 * implicit in a program -- the reachability conditions triggering
61 * garbage collection. As illustrated in the sample usages below,
62 * this method is applicable only when reclamation may have visible
63 * effects, which is possible for objects with finalizers (see Section
64 * 12.6 of the Java Language Specification) that are implemented in
65 * ways that rely on ordering control for correctness.
66 *
67 * <p><b>Sample Usages</b>
68 *
69 * <p><b>Safe publication.</b> With care, method {@code orderWrites}
70 * may be used to obtain the memory safety effects of {@code final}
71 * for a field that cannot be declared as {@code final}, because its
72 * primary initialization cannot be performed in a constructor, in
73 * turn because it is used in a framework requiring that all classes
74 * have a no-argument constructor; as in:
75 *
76 * <pre> {@code
77 * class WidgetHolder {
78 * private Widget widget;
79 * public WidgetHolder() {}
80 * public static WidgetHolder newWidgetHolder(Params params) {
81 * WidgetHolder h = new WidgetHolder();
82 * h.widget = new Widget(params);
83 * return Fences.orderWrites(h);
84 * }
85 * }}</pre>
86 *
87 * Here, the invocation of {@code orderWrites} ensures that the
88 * effects of the widget assignment are ordered before those of any
89 * (unknown) subsequent stores of {@code h} in other variables that
90 * make {@code h} available for use by other objects. Initialization
91 * sequences using {@code orderWrites} require more care than those
92 * involving {@code final} fields. When {@code final} is not used,
93 * compilers cannot help you to ensure that the field is set correctly
94 * across all usages. You must fully initialize objects
95 * <em>before</em> the {@code orderWrites} invocation that makes
96 * references to them safe to assign to accessible variables. Further,
97 * initialization sequences must not internally "leak" the reference
98 * by using it as an argument to a callback method or adding it to a
99 * static data structure. If less constrained usages were required,
100 * it may be possible to cope using more extensive sets of fences, or
101 * as a normally better choice, using synchronization (locking).
102 * Conversely, if it were possible to do so, the best option would be
103 * to rewrite class {@code WidgetHolder} to use {@code final}.
104 *
105 * <p>An alternative approach is to place similar mechanics in the
106 * (sole) method that makes such objects available for use by others.
107 * Here is a stripped-down example illustrating the essentials. In
108 * practice, among other changes, you would use access methods instead
109 * of a public field.
110 *
111 * <pre> {@code
112 * class AnotherWidgetHolder {
113 * public Widget widget;
114 * void publish(Widget w) {
115 * this.widget = Fences.orderWrites(w);
116 * }
117 * // ...
118 * }}</pre>
119 *
120 * In this case, the {@code orderWrites} invocation occurs before the
121 * store making the object available. Correctness again relies on
122 * ensuring that there are no leaks prior to invoking this method, and
123 * that it really is the <em>only</em> means of accessing the
124 * published object. This approach is not often applicable --
125 * normally you would publish objects using a thread-safe collection
126 * that itself guarantees the expected ordering relations. However, it
127 * may come into play in the construction of such classes themselves.
128 *
129 * <p><b>Safely updating fields.</b> Outside of the initialization
130 * idioms illustrated above, Fence methods ordering writes must be
131 * paired with those ordering reads. To illustrate, suppose class
132 * {@code c} contains an accessible variable {@code data} that should
133 * have been declared as {@code volatile} but wasn't:
134 *
135 * <pre> {@code
136 * class C {
137 * Object data; // need volatile access but not volatile
138 * // ...
139 * }
140 *
141 * class App {
142 * Object getData(C c) {
143 * return Fences.orderReads(c).data;
144 * }
145 *
146 * void setData(C c) {
147 * Object newValue = ...;
148 * c.data = Fences.orderWrites(newValue);
149 * Fences.orderAccesses(c);
150 * }
151 * // ...
152 * }}</pre>
153 *
154 * Method {@code getData} provides an emulation of {@code volatile}
155 * reads of (non-long/double) fields by ensuring that the read of
156 * {@code c} obtained as an argument is ordered before subsequent
157 * reads using this reference, and then performs the read of its
158 * field. Method {@code setData} provides an emulation of volatile
159 * writes, ensuring that all other relevant writes have completed,
160 * then performing the assignment, and then ensuring that the write is
161 * ordered before any other access. These techniques may apply even
162 * when fields are not directly accessible, in which case calls to
163 * fence methods would surround calls to methods such as {@code
164 * c.getData()}. However, these techniques cannot be applied to
165 * {@code long} or {@code double} fields because reads and writes of
166 * fields of these types are not guaranteed to be
167 * atomic. Additionally, correctness may require that all accesses of
168 * such data use these kinds of wrapper methods, which you would need
169 * to manually ensure.
170 *
171 * <p>More generally, Fence methods can be used in this way to achieve
172 * the safety properties of {@code volatile}. However their use does
173 * not necessarily guarantee the full sequential consistency
174 * properties specified in the Java Language Specification chapter 17
175 * for programs using {@code volatile}. In particular, emulation using
176 * Fence methods is not guaranteed to maintain the property that
177 * {@code volatile} operations performed by different threads are
178 * observed in the same order by all observer threads.
179 *
180 * <p><b>Acquire/Release management of threadsafe objects</b>. It may
181 * be possible to use weaker conventions for volatile-like variables
182 * when they are used to keep track of objects that fully manage their
183 * own thread-safety and synchronization. Here, an acquiring read
184 * operation remains the same as a volatile-read, but a releasing
185 * write differs by virtue of not itself ensuring an ordering of its
186 * write with subsequent reads, because the required effects are
187 * already ensured by the referenced objects.
188 * For example:
189 *
190 * <pre> {@code
191 * class Item {
192 * synchronized f(); // ALL methods are synchronized
193 * // ...
194 * }
195 *
196 * class ItemHolder {
197 * private Item item;
198 * Item acquireItem() {
199 * return Fences.orderReads(item);
200 * }
201 *
202 * void releaseItem(Item x) {
203 * item = Fences.orderWrites(x);
204 * }
205 *
206 * // ...
207 * }}</pre>
208 *
209 * Because this construction avoids use of {@code orderAccesses},
210 * which is typically more costly than the other fence methods, it may
211 * result in better performance than using {@code volatile} or its
212 * emulation. However, as is the case with most applications of fence
213 * methods, correctness relies on the usage context -- here, the
214 * thread safety of {@code Item}, as well as the lack of need for full
215 * volatile semantics inside this class itself. However, the second
216 * concern means that it can be difficult to extend the {@code
217 * ItemHolder} class in this example to be more useful.
218 *
219 * <p><b>Avoiding premature finalization.</b> Finalization may occur
220 * whenever a Java Virtual Machine detects that no reference to an
221 * object will ever be stored in the heap: A garbage collector may
222 * reclaim an object even if the fields of that object are still in
223 * use, so long as the object has otherwise become unreachable. This
224 * may have surprising and undesirable effects in cases such as the
225 * following example in which the bookkeeping associated with a class
226 * is managed through array indices. Here, method {@code action}
227 * uses a {@code reachabilityFence} to ensure that the Resource
228 * object is not reclaimed before bookkeeping on an associated
229 * ExternalResource has been performed; in particular here, to ensure
230 * that the array slot holding the ExternalResource is not nulled out
231 * in method {@link Object#finalize}, which may otherwise run
232 * concurrently.
233 *
234 * <pre> {@code
235 * class Resource {
236 * private static ExternalResource[] externalResourceArray = ...
237 *
238 * int myIndex;
239 * Resource(...) {
240 * myIndex = ...
241 * externalResourceArray[myIndex] = ...;
242 * ...
243 * }
244 * protected void finalize() {
245 * externalResourceArray[myIndex] = null;
246 * ...
247 * }
248 * public void action() {
249 * try {
250 * // ...
251 * int i = myIndex;
252 * Resource.update(externalResourceArray[i]);
253 * } finally {
254 * Fences.reachabilityFence(this);
255 * }
256 * }
257 * private static void update(ExternalResource ext) {
258 * ext.status = ...;
259 * }
260 * }}</pre>
261 *
262 * Here, the call to {@code reachabilityFence} is nonintuitively
263 * placed <em>after</em> the call to {@code update}, to ensure that
264 * the array slot is not nulled out by {@link Object#finalize} before
265 * the update, even if the call to {@code action} was the last use of
266 * this object. This might be the case if for example a usage in a
267 * user program had the form {@code new Resource().action();} which
268 * retains no other reference to this Resource. While probably
269 * overkill here, {@code reachabilityFence} is placed in a {@code
270 * finally} block to ensure that it is invoked across all paths in the
271 * method. In a method with more complex control paths, you might
272 * need further precautions to ensure that {@code reachabilityFence}
273 * is encountered along all of them.
274 *
275 * <p>It is sometimes possible to better encapsulate use of
276 * {@code reachabilityFence}. Continuing the above example, if it
277 * were OK for the call to method update to proceed even if the
278 * finalizer had already executed (nulling out slot), then you could
279 * localize use of {@code reachabilityFence}:
280 *
281 * <pre> {@code
282 * public void action2() {
283 * // ...
284 * Resource.update(getExternalResource());
285 * }
286 * private ExternalResource getExternalResource() {
287 * ExternalResource ext = externalResourceArray[myIndex];
288 * Fences.reachabilityFence(this);
289 * return ext;
290 * }}</pre>
291 *
292 * <p>Method {@code reachabilityFence} is not required in
293 * constructions that themselves ensure reachability. For example,
294 * because objects that are locked cannot in general be reclaimed, it
295 * would suffice if all accesses of the object, in all methods of
296 * class Resource (including {@code finalize}) were enclosed in {@code
297 * synchronized (this)} blocks. (Further, such blocks must not include
298 * infinite loops, or themselves be unreachable, which fall into the
299 * corner case exceptions to the "in general" disclaimer.) However,
300 * method {@code reachabilityFence} remains a better option in cases
301 * where this approach is not as efficient, desirable, or possible;
302 * for example because it would encounter deadlock.
303 *
304 * <p><b>Formal Properties.</b>
305 *
306 * <p>Using the terminology of The Java Language Specification chapter
307 * 17, the rules governing the semantics of the methods of this class
308 * are as follows:
309 *
310 * <p>The following is still under construction.
311 *
312 * <dl>
313 *
314 * <dt><b>[Definitions]</b>
315 * <dd>
316 * <ul>
317 *
318 * <li>Define <em>sequenced(a, b)</em> to be true if <em>a</em>
319 * occurs before <em>b</em> in <em>program order</em>.
320 *
321 * <li>Define <em>accesses(a, p)</em> to be true if
322 * <em>a</em> is a read or write of a field (or if an array, an
323 * element) of the object referenced by <em>p</em>.
324 *
325 * <li>Define <em>deeplyAccesses(a, p)</em> to be true if either
326 * <em>accesses(a, p)</em> or <em>deeplyAccesses(a, q)</em> where
327 * <em>q</em> is the value seen by some read <em>r</em>
328 * such that <em>accesses(r, p)</em>.
329 *
330 * </ul>
331 * <dt><b>[Matching]</b>
332 * <dd>Given:
333 *
334 * <ul>
335 *
336 * <li><em>p</em>, a reference to an object
337 *
338 * <li><em>wf</em>, an invocation of {@code orderWrites(p)} or
339 * {@code orderAccesses(p)}
340 *
341 * <li><em>w</em>, a write of value <em>p</em>
342 *
343 * <li><em>rf</em>, an invocation of {@code orderReads(p)} or
344 * {@code orderAccesses(p)}
345 *
346 * <li><em>r</em>, a read returning value <em>p</em>
347 *
348 * </ul>
349 * If:
350 * <ul>
351 * <li>sequenced(wf, w)
352 * <li>read <em>r</em> sees write <em>w</em>
353 * <li>sequenced(r, rf)
354 * </ul>
355 * Then:
356 * <ul>
357 *
358 * <li><em>wf happens-before rf</em>
359 *
360 * <li><em>wf</em> precedes <em>rf</em> in the
361 * <em>synchronization order</em>
362 *
363 * <li>If (<em>r1</em>, <em>w1</em>) and (<em>r2</em>,
364 * <em>w2</em>) are two pairs of reads and writes, both
365 * respectively satisfying the above conditions for <em>p</em>,
366 * and sequenced(r1, r2) then it is not the case that <em>w2
367 * happens-before w1</em>.
368 *
369 * </ul>
370 * <dt><b>[Initial Reads]</b>
371 * <dd>Given:
372 *
373 * <ul>
374 *
375 * <li><em>p</em>, a reference to an object
376 *
377 * <li><em>a</em>, an access where deeplyAccesses(a, p)
378 *
379 * <li><em>wf</em>, an invocation of {@code orderWrites(p)} or
380 * {@code orderAccesses(p)}
381 *
382 * <li><em>w</em>, a write of value <em>p</em>
383 *
384 * <li><em>r</em>, a read returning value <em>p</em>
385 *
386 * <li><em>b</em>, an access where accesses(b, p)
387 *
388 * </ul>
389 * If:
390 * <ul>
391 * <li>sequenced(a, wf);
392 * <li>sequenced(wf, w)
393 * <li>read <em>r</em> sees write <em>w</em>, and
394 * <em>r</em> is the first read by some thread
395 * <em>t</em> that sees value <em>p</em>
396 * <li>sequenced(r, b)
397 * </ul>
398 * Then:
399 * <ul>
400 * <li>the effects of <em>b</em> are constrained
401 * by the relation <em>a happens-before b</em>.
402 * </ul>
403 * <dt><b>[orderAccesses]</b>
404 * <dd>Given:
405 *
406 * <ul>
407 * <li><em>p</em>, a reference to an object
408 * <li><em>f</em>, an invocation of {@code orderAccesses(p)}
409 * </ul>
410 * If:
411 * <ul>
412 * <li>sequenced(f, w)
413 * </ul>
414 *
415 * Then:
416 *
417 * <ul>
418 *
419 * <li><em>f</em> is an element of the <em>synchronization order</em>.
420 *
421 * </ul>
422 * <dt><b>[Reachability]</b>
423 * <dd>Given:
424 *
425 * <ul>
426 *
427 * <li><em>p</em>, a reference to an object
428 *
429 * <li><em>f</em>, an invocation of {@code reachabilityFence(p)}
430 *
431 * <li><em>a</em>, an access where accesses(a, p)
432 *
433 * <li><em>b</em>, an action (by a garbage collector) taking
434 * the form of an invocation of {@code
435 * p.finalize()} or of enqueuing any {@link
436 * java.lang.ref.Reference} constructed with argument <em>p</em>
437 *
438 * </ul>
439 *
440 * If:
441 * <ul>
442 * <li>sequenced(a, f)
443 * </ul>
444 *
445 * Then:
446 *
447 * <ul>
448 *
449 * <li><em>a happens-before b</em>.
450 *
451 * </ul>
452 *
453 * </dl>
454 *
455 * @since 1.7
456 * @author Doug Lea
457 */
458 public class Fences {
459 private Fences() {} // Non-instantiable
460
461 /**
462 * The methods of this class are intended to be intrinisified by a
463 * JVM. However, we provide correct but inefficient Java-level
464 * code that simply reads and writes a static volatile
465 * variable. Without JVM support, the consistency effects are
466 * stronger than necessary, and the memory contention effects can
467 * be a serious performance issue.
468 */
469 private static volatile int theVolatile;
470
471 /**
472 * Informally: Ensures that a read of the given reference prior to
473 * the invocation of this method occurs before a subsequent use of
474 * the given reference with the effect of reading or writing a
475 * field (or if an array, element) of the referenced object. The
476 * use of this method is sensible only when paired with other
477 * invocations of {@link #orderWrites} and/or {@link
478 * #orderAccesses} for the given reference. For details, see the
479 * class documentation for this class.
480 *
481 * @param ref the reference. If null, this method has no effect.
482 * @param <T> the type of the reference
483 * @return the given ref, to simplify usage
484 */
485 public static <T> T orderReads(T ref) {
486 int ignore = theVolatile;
487 return ref;
488 }
489
490 /**
491 * Informally: Ensures that a use of the given reference with the
492 * effect of reading or writing a field (or if an array, element)
493 * of the referenced object, prior to the invocation of this
494 * method occur before a subsequent write of the reference. For
495 * details, see the class documentation for this class.
496 *
497 * @param ref the reference. If null, this method has no effect.
498 * @param <T> the type of the reference
499 * @return the given ref, to simplify usage
500 */
501 public static <T> T orderWrites(T ref) {
502 theVolatile = 0;
503 return ref;
504 }
505
506 /**
507 * Informally: Ensures that accesses (reads or writes) using the
508 * given reference prior to the invocation of this method occur
509 * before subsequent accesses. For details, see the class
510 * documentation for this class.
511 *
512 * @param ref the reference. If null, this method has no effect.
513 * @param <T> the type of the reference
514 * @return the given ref, to simplify usage
515 */
516 public static <T> T orderAccesses(T ref) {
517 theVolatile = 0;
518 return ref;
519 }
520
521 /**
522 * Ensures that the object referenced by the given reference
523 * remains <em>strongly reachable</em> (as defined in the {@link
524 * java.lang.ref} package documentation), regardless of any prior
525 * actions of the program that might otherwise cause the object to
526 * become unreachable; thus, the referenced object is not
527 * reclaimable by garbage collection at least until after the
528 * invocation of this method. Invocation of this method does not
529 * itself initiate garbage collection or finalization.
530 *
531 * <p>See the class-level documentation for further explanation
532 * and usage examples.
533 *
534 * @param ref the reference. If null, this method has no effect.
535 */
536 public static void reachabilityFence(Object ref) {
537 if (ref != null) {
538 synchronized (ref) {}
539 }
540 }
541 }