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 org.dbunit.util.concurrent;
16:
17: import org.slf4j.Logger;
18: import org.slf4j.LoggerFactory;
19:
20: import java.lang.reflect.InvocationTargetException;
21:
22: /**
23: * A one-slot buffer, using semaphores to control access.
24: * Slots are usually more efficient and controllable than using other
25: * bounded buffers implementations with capacity of 1.
26: * <p>
27: * Among other applications, Slots can be convenient in token-passing
28: * designs: Here. the Slot holds a some object serving as a token,
29: * that can be obtained
30: * and returned by various threads.
31: *
32: * <p>[<a href="http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html"> Introduction to this package. </a>]
33: **/
34:
35: public class Slot extends SemaphoreControlledChannel {
36:
37: /**
38: * Logger for this class
39: */
40: private static final Logger logger = LoggerFactory
41: .getLogger(Slot.class);
42:
43: /**
44: * Create a buffer with the given capacity, using
45: * the supplied Semaphore class for semaphores.
46: * @exception NoSuchMethodException If class does not have constructor
47: * that intializes permits
48: * @exception SecurityException if constructor information
49: * not accessible
50: * @exception InstantiationException if semaphore class is abstract
51: * @exception IllegalAccessException if constructor cannot be called
52: * @exception InvocationTargetException if semaphore constructor throws an
53: * exception
54: **/
55:
56: public Slot(Class semaphoreClass) throws NoSuchMethodException,
57: SecurityException, InstantiationException,
58: IllegalAccessException, InvocationTargetException {
59: super (1, semaphoreClass);
60: }
61:
62: /**
63: * Create a new Slot using default Semaphore implementations
64: **/
65: public Slot() {
66: super (1);
67: }
68:
69: /** The slot **/
70: protected Object item_ = null;
71:
72: /** Set the item in preparation for a take **/
73: protected synchronized void insert(Object x) {
74: logger.debug("insert(x=" + x + ") - start");
75:
76: item_ = x;
77: }
78:
79: /** Take item known to exist **/
80: protected synchronized Object extract() {
81: logger.debug("extract() - start");
82:
83: Object x = item_;
84: item_ = null;
85: return x;
86: }
87:
88: public synchronized Object peek() {
89: logger.debug("peek() - start");
90:
91: return item_;
92: }
93:
94: }
|