我有以下课程:
public class MyClass{
private List<Integer> ints = new LinkedList<Integer>();
public List<Integer> getInts(){
return ints;
}
public synchronized void doAction(){
//Do some with the list
}
}
我只需要允许一个线程访问List
。我会这样做:
public class MyClass{
private List<Integer> ints = new LinkedList<Integer>();
private static final Semaphore s = new Semaphore(1);
public List<Integer> getInts(){
s.acquire();
return ints;
}
public void release(){
s.release();
}
public synchronized void doAction(){
s.acquire();
//Do some with the list
s.release();
}
}
但是实现显然不可靠,因为如果客户端通过getter请求List
向其中添加一些元素而忘记调用release()
如果尝试调用我们会遇到麻烦doAction
方法。
问题的解决方案是什么?
答案 0 :(得分:4)
不要让客户获得参考。将列表上工作的所有方法放到MyClass
并同步它们。
但是,您可以允许用户获取列表的快照副本。
答案 1 :(得分:2)
您可以使用同步列表:
private List<Integer> ints = Collections.synchronizedList(new LinkedList<Integer>());