Re[5]: Блокировка поля класса в многоп. среде
От: ingie Россия  
Дата: 26.03.08 10:48
Оценка:
Здравствуйте, Kuzz, Вы писали:


K>Чтобы нельзя было сделать doSome(c), нужно, чтобы с было Immutable, неизменяемое. В данном случае, List можно возвращать

K>через Collections.unmodifiableList(list).

Цель не будет достигнута. Так как:
    UnmodifiableCollection(Collection<? extends E> c) {
            if (c==null)
                throw new NullPointerException();
            this.c = c;
        }

    public Iterator<E> iterator() {
        return new Iterator<E>() {
        Iterator<? extends E> i = c.iterator();

        public boolean hasNext() {return i.hasNext();}
        public E next()      {return i.next();}
        public void remove() {
            throw new UnsupportedOperationException();
                }
        };
        }

Тогда уж надо
synchronized (current) {
a = new ArrayList();
a.addAll(current);
return a;
}



I>>Если уж с блокировками, то может лучше

I>>
I>>class Channel {
I>>...
I>>  forEach(Visitor v) {
I>>    synchronized(current) {
I>>      for (o : current) {
I>>        v.visit(o);
I>>      }
I>>    }
I>>  }
I>>...
I>>}
I>>

I>>И без getCurrent() вообще.
I>>Иначе не будет гарантий как я понимаю. Или нет?

K>А зачем такие сложнотсти? Загромоздите архитектуру..

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