| ||||
|
Code - Class EDU.oswego.cs.dl.util.concurrent.FIFOSemaphore1 /* 2 File: FIFOSemaphore.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 15 package EDU.oswego.cs.dl.util.concurrent; 16 17 /** 18 * A First-in/First-out implementation of a Semaphore. 19 * Waiting requests will be satisified in 20 * the order that the processing of those requests got to a certain point. 21 * If this sounds vague it is meant to be. FIFO implies a 22 * logical timestamping at some point in the processing of the 23 * request. To simplify things we don't actually timestamp but 24 * simply store things in a FIFO queue. Thus the order in which 25 * requests enter the queue will be the order in which they come 26 * out. This order need not have any relationship to the order in 27 * which requests were made, nor the order in which requests 28 * actually return to the caller. These depend on Java thread 29 * scheduling which is not guaranteed to be predictable (although 30 * JVMs tend not to go out of their way to be unfair). 31 * <p>[<a HREF="http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html"> Introduction to this package. </a>] 32 **/ 33 34 public class FIFOSemaphore extends QueuedSemaphore { 35 36 /** 37 * Create a Semaphore with the given initial number of permits. 38 * Using a seed of one makes the semaphore act as a mutual exclusion lock. 39 * Negative seeds are also allowed, in which case no acquires will proceed 40 * until the number of releases has pushed the number of permits past 0. 41 **/ 42 43 public FIFOSemaphore(long initialPermits) { 44 super(new FIFOWaitQueue(), initialPermits); 45 } 46 47 /** 48 * Simple linked list queue used in FIFOSemaphore. 49 * Methods are not synchronized; they depend on synch of callers 50 **/ 51 52 protected static class FIFOWaitQueue extends WaitQueue { 53 protected WaitNode head_ = null; 54 protected WaitNode tail_ = null; 55 56 protected void insert(WaitNode w) { 57 if (tail_ == null) 58 head_ = tail_ = w; 59 else { 60 tail_.next = w; 61 tail_ = w; 62 } 63 } 64 65 protected WaitNode extract() { 66 if (head_ == null) 67 return null; 68 else { 69 WaitNode w = head_; 70 head_ = w.next; 71 if (head_ == null) tail_ = null; 72 w.next = null; 73 return w; 74 } 75 } 76 } 77 78 } 79 |
|||
Java API By Example, From Geeks To Geeks. |
Conditions of Use |
About Us
© 2002 - 2005, KickJava.com, or its affiliates
|