【发布时间】:2016-02-02 05:55:43
【问题描述】:
我正在创建一个类,我需要为我的用例在两个方法“insert”和“getItems”之间进行同步。虽然在我看来,按照下面的代码使用这两种方法不会产生任何副作用:-
public class EmailBuffer {
private List<String> items = new ArrayList<String>();
public void insertItem(String item) {
synchronized (items) {
items.add(item);
}
}
public String[] getItems() {
synchronized (items) {
String[] objects = new String[items.size()];
items.toArray(objects);
items.clear();
return objects;
}
}
}
但是如果使用上述代码会有任何副作用,谁能帮助我? 或者,我可以创建另一个实例变量 私有对象 object = new Object();并且可以在“insert”和“getItems”方法的同步块中使用它,但是这样,如果上面的代码根本没有任何问题,我将引入一个根本不需要的额外实例变量。
【问题讨论】:
-
您的同步习语应该按预期工作,但逻辑有点可疑:我建议记录这样一个事实,即获取所有“项目”实际上会清除集合。
-
是的,没错。文档正在等待中。我的要求是在检索到对象后清除条目,因此我必须清除列表。
标签: java