Объясните синхронизацию наборов, когда итераторы будут использоваться?

Это подразумевается для основных конструкторов без параметров, но это необходимо для значений по умолчанию в текущем классе:

public class BaseClass {
    protected string X;

    public BaseClass() {
        this.X = "Foo";
    }
}

public class MyClass : BaseClass
{
    public MyClass() 
        // no ref to base needed
    {
        // initialise stuff
        this.X = "bar";
    }

    public MyClass(int param1, string param2)
        :this() // This is needed to hit the parameterless ..ctor
    {
         // this.X will be "bar"
    }

    public MyClass(string param1, int param2)
        // :base() // can be implied
    {
         // this.X will be "foo"
    }
}
20
задан DivideByHero 21 November 2009 в 15:05
поделиться

1 ответ

Итерация по коллекциям в Java не является потокобезопасной, даже если вы используете одну из синхронизированных оболочек ( Collections.synchronizedMap (...) ):

Крайне важно, чтобы пользователь вручную синхронизировал возвращенные map при итерации по любому из представлений своей коллекции:

 Map m = Collections.synchronizedMap (new HashMap ());
...
Установите s = m.keySet (); // Не обязательно быть в синхронизированном блоке
...
synchronized (m) {// Синхронизация по m, а не s!
Итератор i = s.iterator (); // Должен быть в синхронизированном блоке
 в то время как (i.hasNext ())
 foo (i.next ());
}

Документы Java Collection Framework

Другие вызовы синхронизированных коллекций безопасны, поскольку классы-оболочки окружают их синхронизированными блоками, которые используют коллекцию-оболочку в качестве своего монитора:

public int size() {
    synchronized( this ) {
        return collection.size();
    }
}

с collection является исходной коллекцией. Это работает для всех методов, предоставляемых коллекцией / картой, за исключением материала итерации.

Набор ключей карты синхронизируется точно так же: синхронизированная оболочка вообще не возвращает исходный набор ключей. Вместо этого он возвращает специальную синхронизированную оболочку исходного набора ключей коллекции. То же самое относится к набору записей и набору значений.

41
ответ дан 29 November 2019 в 23:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: