阅读和写作集合

时间:2015-07-07 15:14:28

标签: java multithreading

我有以下课程:

public class GroupsContainer{

    private final List<Group> col;

    public synchronized Group get(int ids){
            return col.get(ids);
    }

    public synchronized void add(Group g){
            col.add(g);
    }
}

现在假设某个线程想要从0到10获取所有元素:

List<Group> lst;
GroupContainer gc;
//staff
for(int i = 0; i < 10; i++)
    lst.add(gc.get(i));

同时另一个线程正在尝试写入0到10之间的新元素:

List<Group> lst;
GroupContainer gc;
//staff
for(int i = 0; i < 10; i++)
    gc.add(i, lst.get(i));

我需要做以下事情:

一旦作者释放了监视器,读者就应该在此之后立即阻止所有作者的帖子,并且不应该允许作者在完成阅读之前写一些其他内容。

有可能吗?使用当前的实现它将无法工作。

1 个答案:

答案 0 :(得分:2)

您的每个方法都是同步的,但您希望同步它们的多个调用(在您的示例中为10)。您可以简单地将代码包装在同步块中:

 synchronized(gc){
    for(int i = 0; i < 10; i++)
        lst.add(gc.get(i));
}