2015-07-07 3 views
0

У меня есть следующий класс:Чтение и запись в коллекции

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)); 

мне нужно сделать следующее:

После того, как автор выпустит монитор, читатель должен сразу же заблокировать все записи писателя и не должен позволять писателю писать что-то еще, пока он не закончит чтение.

Это можно сделать? При текущей реализации это не сработает.

ответ

2

Каждый из ваших методов синхронизирован, но вы хотите синхронизировать их с несколькими вызовами (10 в вашем примере). вы можете просто обернуть свой код в синхронизированный блок:

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

Но читатель и писатель, вероятно, являются оттисками разных классов. – user3663882

+0

Итак? Если вы синхронизируете один и тот же экземпляр GroupContainer, блокировка - это GroupContainer, а не вызывающий класс. –

+0

Действительно, это ты. – user3663882

Смежные вопросы