-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSynchronizedBoundedStack.java
More file actions
122 lines (111 loc) · 2.91 KB
/
SynchronizedBoundedStack.java
File metadata and controls
122 lines (111 loc) · 2.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import java.util.concurrent.locks.*;
/**
* Stack that uses locks to synchronize access by threads to push and pop items
* onto the stack.
*
* @author Kevin Wood
* @version 1.0
*/
public class SynchronizedBoundedStack extends BoundedStack {
private ReentrantLock sLock;
private Condition fullCondition;
private Condition emptyCondition;
public SynchronizedBoundedStack(int capacity) {
super(capacity);
sLock = new ReentrantLock();
fullCondition = sLock.newCondition();
emptyCondition = sLock.newCondition();
}
/**
* Pushes the provided element onto the top of the stack.
*
* @param t : The item to push.
* @throws InterruptedException
*/
@Override
public void push(int t) throws InterruptedException {
try {
sLock.lock();
while (isFull()) {
System.out.println("Stack Full");
fullCondition.await();
}
elements[top] = t;
top++;
System.out.println("Pushing " + t + " onto the stack");
emptyCondition.signalAll();
} finally {
sLock.unlock();
}
}
/**
* Returns the value on top of the stack.
*
* @return : The value on top of the stack.
*/
@Override
public int peek() throws InterruptedException {
try {
while (isEmpty()) {
System.out.println("Stack Empty");
emptyCondition.await();
}
sLock.lock();
int result = elements[top - 1];
fullCondition.signalAll();
return result;
} finally {
sLock.unlock();
}
}
/**
* Removes the top value from the stack and returns it.
*
* @return : The item popped from the stack.
* @throws InterruptedException
*/
@Override
public int pop() throws InterruptedException {
try {
sLock.lock();
while (isEmpty()) {
System.out.println("Stack Empty");
emptyCondition.await();
}
top--;
int result = elements[top];
System.out.println("Popping " + result + " from the stack");
fullCondition.signalAll();
return result;
} finally {
sLock.unlock();
}
}
/**
* Returns true if the stack is empty and false otherwise.
*
* @return : Whether the stack is empty.
*/
@Override
public boolean isEmpty() {
return top == 0;
}
/**
* Returns true if the stack is full, and false otherwise.
*
* @return : Whether or not the stack is full.
*/
@Override
public boolean isFull() {
return top == capacity;
}
/**
* Returns the number of elements currently on the stack.
*
* @return : The size of the stack.
*/
@Override
public int getSize() {
return top;
}
}