【发布时间】:2013-06-06 18:58:33
【问题描述】:
在使用 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();
}
}
注意
- 这是一个有界列表
- 除了入队和出队外,没有执行其他操作。
- 我可以使用阻塞队列,但这个问题更多是为了提高我有限的线程知识。
- 如果此问题重复出现,请告诉我。
【问题讨论】:
-
不多,除非您还需要创建
final list,并且如果您需要同步对列表之外的其他内容的访问和对列表的访问,使用专用的lock会更清楚。
标签: java synchronization