Информация об изменениях

Сообщение Re: Вопрос по synchronized от 25.10.2023 16:58

Изменено 25.10.2023 17:03 GarryIV

Re: Вопрос по synchronized
Здравствуйте, pva, Вы писали:

pva>ревьюил тут код свой и возник вопрос по синхронизации:

pva>
    final private LinkedList<Integer> numbers = new LinkedList<>();
pva>...
pva>        synchronized (this.numbers) { // sync on the same instance, w/o special lock
pva>            this.numbers.addAll(other.numbers);
pva>        }
pva>
Есть ли разница синхронизироваться на внешнем объекте (как во многих руководствах) или код выше вполне себе допустим?

pva>Есть ли ограничения приведенного выше кода?
numbers не публичный так что если ты не отдаешь его наружу (а ты не должен) то нет проблем (в том числе и со стороны "руководств").

pva>Попутно есть еще такой вопрос:

pva>Правильно ли я понимаю что для синхронизированных коллекций, например
pva>
    final private LinkedList<Integer> numbers = Collections.synchronizedList(new LinkedList<>());
При использовании коллекции в цикле

pva>
    for (Integer number: numbers) ...
коллекция будет лочится на все время цикла для обеспечения целостности итераторов?

нет не будет

pva>Или корректно было бы сделать

pva>
pva>    final private LinkedList<Integer> local;
pva>    synchronized(this.lock) { local = new LinkedList<>(this.numbers); }
pva>    for (Integer number: local) ...
pva>
?

оно конечно решит проблему ( как и synchronized (this.numbers) )
но в жабе есть конкурентные коллекции же примерно 100 лет как.
про Collections.synchronizedList забудь вообще.
Re: Вопрос по synchronized
Здравствуйте, pva, Вы писали:

pva>ревьюил тут код свой и возник вопрос по синхронизации:

pva>
    final private LinkedList<Integer> numbers = new LinkedList<>();
pva>...
pva>        synchronized (this.numbers) { // sync on the same instance, w/o special lock
pva>            this.numbers.addAll(other.numbers);
pva>        }
pva>
Есть ли разница синхронизироваться на внешнем объекте (как во многих руководствах) или код выше вполне себе допустим?

pva>Есть ли ограничения приведенного выше кода?
numbers не публичный так что если ты не отдаешь его наружу (а ты не должен) то нет проблем (в том числе и со стороны "руководств").

pva>Попутно есть еще такой вопрос:

pva>Правильно ли я понимаю что для синхронизированных коллекций, например
pva>
    final private LinkedList<Integer> numbers = Collections.synchronizedList(new LinkedList<>());
При использовании коллекции в цикле

pva>
    for (Integer number: numbers) ...
коллекция будет лочится на все время цикла для обеспечения целостности итераторов?

нет не будет

pva>Или корректно было бы сделать

pva>
pva>    final private LinkedList<Integer> local;
pva>    synchronized(this.lock) { local = new LinkedList<>(this.numbers); }
pva>    for (Integer number: local) ...
pva>
?

оно конечно решит проблему ( как и synchronized (this.numbers) )
но в жабе есть конкурентные коллекции же примерно 100 лет как в частности CopyOnWriteArrayList примерно вот это и делает.
про Collections.synchronizedList забудь вообще.