在使用 Java Threading Primitives 构造线程安全的有界队列时-这两种构造之间有什么区别
- 创建显式锁定对象。
- 使用列表作为锁并等待它。
示例 1
private final Object lock = new Object();
private ArrayList<String> list = new ArrayList<String>();
public String dequeue() {
synchronized (lock) {
while (list.size() == 0) {
lock.wait();
}
String value = list.remove(0);
lock.notifyAll();
return value;
}
}
public void enqueue(String value) {
synchronized (lock) {
while (list.size() == maxSize) {
lock.wait();
}
list.add(value);
lock.notifyAll();
}
}
示例 2
private ArrayList<String> list = new ArrayList<String>();
public String dequeue() {
synchronized (list) { // lock on list
while (list.size() == 0) {
list.wait(); // wait on list
}
String value = list.remove(0);
list.notifyAll();
return value;
}
}
public void enqueue(String value) {
synchronized (list) { // lock on list
while (list.size() == maxSize) {
list.wait(); // wait on list
}
list.add(value);
list.notifyAll();
}
}
笔记
- 这是一个有界列表
- 除了入队和出队之外,没有执行其他操作。
- 我可以使用阻塞队列,但这个问题更多是为了提高我对线程的有限了解。
- 如果这个问题重复,请告诉我。