当使用Java线程基元构造线程安全有界队列时,这两个构造之间有什么区别?
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();
}
}备注
发布于 2013-06-06 19:13:44
简单的回答是,不,除了维护额外的锁对象的额外内存开销之外,没有功能上的区别。不过,在做出最后决定之前,我会考虑一些与语义相关的项目。
,我需要在不仅仅是内部列表上执行同步操作吗?
假设您希望为您的ArrayList维护一个并行数据结构,这样列表上的所有操作和并行数据结构都需要同步。在这种情况下,最好使用外部锁,因为对列表或结构的锁定可能会使该类的未来开发工作混淆。
,我是否将访问队列类之外的列表?
假设您希望为您的列表提供一个访问器方法,或者使其对队列类的扩展可见。如果使用外部锁对象,则检索对列表的引用的类将永远无法对该列表执行线程安全操作。在这种情况下,最好在列表上同步,并在API中明确表示,对列表的外部访问/修改也必须在该列表上同步。
我相信有更多的理由可以让你选择一个而不是另一个,但这是我能想到的两大原因。
https://stackoverflow.com/questions/16970055
复制相似问题