Java 一次只允许一个线程使用对象

Java 一次只允许一个线程使用对象,java,multithreading,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

我有以下课程:

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
    }
}
但是实现显然是不可靠的,因为如果客户机通过getter请求
列表
,以便向其中添加一些元素,并且忘记调用
release()
,那么如果尝试调用
doAction
方法,我们就会遇到麻烦


该问题的解决方案是什么?

不允许客户端获取引用。将列表中所有有效的方法放到
MyClass
并同步它们


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

不允许客户端获取引用。将列表中所有有效的方法放到
MyClass
并同步它们


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

您可以使用同步列表:

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

您可以使用同步列表:

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

但这不会在迭代过程中提供同步,例如。@Kayaman你的意思是,如果我们某个线程在更改列表,而另一个线程在迭代过程中打印其内容,那么我们将无法得到我们想要的…确切地说。然后,您必须相信任何迭代线程都会在列表上同步。在处理线程和列表时,始终建议在列表上同步。如果你想提供一个“防白痴”的API,你必须像@Kayaman said.BTW那样包装所有调用,尽管为集合实现的mst抛出ConcurrentModificationException,但我们不能依赖它,只需将代码包装在try-catch中,对吗?但这不会在迭代过程中提供同步,例如。@Kayaman你的意思是,如果我们某个线程正在更改列表,而另一个线程正在通过迭代打印其内容,那么我们就不会得到我们想要的东西……正是。然后,您必须相信任何迭代线程都会在列表上同步。在处理线程和列表时,始终建议在列表上同步。如果你想提供一个“防白痴”的API,你必须像@Kayaman said.BTW那样包装所有调用,尽管为集合实现的mst抛出ConcurrentModificationException,但我们不能依赖它,而只是将代码包装在try-catch中,对吗?Kayaman在这里有正确的答案,而且,在未来,如果你想用这样的代码< >信号量< /C>,考虑使用<代码> java .UTI.O.Out.Opjy< /Cord>。Kayaman在这里有正确的答案,但是,如果你想使用<代码>信号量< /代码>,请考虑使用<代码> java .UTI.Orth.Opjy< /Cord>。