我有以下课程:
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));
我需要做以下事情:
一旦作者释放了监视器,读者就应该在此之后立即阻止所有作者的帖子,并且不应该允许作者在完成阅读之前写一些其他内容。
有可能吗?使用当前的实现它将无法工作。
答案 0 :(得分:2)
您的每个方法都是同步的,但您希望同步它们的多个调用(在您的示例中为10)。您可以简单地将代码包装在同步块中:
synchronized(gc){
for(int i = 0; i < 10; i++)
lst.add(gc.get(i));
}