01: /*
02: File: Slot.java
03:
04: Originally written by Doug Lea and released into the public domain.
05: This may be used for any purposes whatsoever without acknowledgment.
06: Thanks for the assistance and support of Sun Microsystems Labs,
07: and everyone contributing, testing, and using this code.
08:
09: History:
10: Date Who What
11: 11Jun1998 dl Create public version
12: 25aug1998 dl added peek
13: */
14:
15: package EDU.oswego.cs.dl.util.concurrent;
16:
17: import java.lang.reflect.*;
18:
19: /**
20: * A one-slot buffer, using semaphores to control access.
21: * Slots are usually more efficient and controllable than using other
22: * bounded buffers implementations with capacity of 1.
23: * <p>
24: * Among other applications, Slots can be convenient in token-passing
25: * designs: Here. the Slot holds a some object serving as a token,
26: * that can be obtained
27: * and returned by various threads.
28: *
29: * <p>[<a href="http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html"> Introduction to this package. </a>]
30: **/
31:
32: public class Slot extends SemaphoreControlledChannel {
33:
34: /**
35: * Create a buffer with the given capacity, using
36: * the supplied Semaphore class for semaphores.
37: * @exception NoSuchMethodException If class does not have constructor
38: * that intializes permits
39: * @exception SecurityException if constructor information
40: * not accessible
41: * @exception InstantiationException if semaphore class is abstract
42: * @exception IllegalAccessException if constructor cannot be called
43: * @exception InvocationTargetException if semaphore constructor throws an
44: * exception
45: **/
46:
47: public Slot(Class semaphoreClass) throws NoSuchMethodException,
48: SecurityException, InstantiationException,
49: IllegalAccessException, InvocationTargetException {
50: super (1, semaphoreClass);
51: }
52:
53: /**
54: * Create a new Slot using default Semaphore implementations
55: **/
56: public Slot() {
57: super (1);
58: }
59:
60: /** The slot **/
61: protected Object item_ = null;
62:
63: /** Set the item in preparation for a take **/
64: protected synchronized void insert(Object x) {
65: item_ = x;
66: }
67:
68: /** Take item known to exist **/
69: protected synchronized Object extract() {
70: Object x = item_;
71: item_ = null;
72: return x;
73: }
74:
75: public synchronized Object peek() {
76: return item_;
77: }
78:
79: }
|