当时只允许一个线程使用对象

时间:2015-07-06 07:42:35

标签: java multithreading

我有以下课程:

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方法。

问题的解决方案是什么?

2 个答案:

答案 0 :(得分:4)

不要让客户获得参考。将列表上工作的所有方法放到MyClass并同步它们。

但是,您可以允许用户获取列表的快照副本。

答案 1 :(得分:2)

您可以使用同步列表:

private List<Integer> ints = Collections.synchronizedList(new LinkedList<Integer>());