Это повреждается проверенная дважды блокировка?

Похоже,

{ type, which, selected: { ...selected, ...hovered } } 

некоторые переменные объединены в один объект, как

  • type
  • which
  • [ 1111] новый объект selected со свойствами
    • selected, который содержит объект
    • hovered, который также содержит объект
    [1111 ]

со свойствами сокращения и расширенным синтаксисом ... для объектов.

5
задан GingerPlusPlus 13 February 2016 в 16:45
поделиться

4 ответа

Принятие Вас хочет, чтобы та самая внутренняя строка читала:

row = dao().create(id);

Это не перепроверяемое принятие блокировки классика задач dao().fetch правильно mutexed из создать метода.

Править: (код был обновлен),

Классической проблеме перепроверяемой блокировки присваивали значение, прежде чем инициализация произойдет, где два потока получают доступ к тому же значению.

Принятие ДАО правильно синхронизируется и не возвратит частично инициализированное значение, это не страдает от дефектов перепроверяемой идиомы блокировки.

4
ответ дан 18 December 2019 в 13:20
поделиться

Я думаю в этом случае, checkstyle корректен. В Вашем коде, как представлено, рассмотрите то, что произошло бы, если бы два потока оба имели row == null при записи в синхронизируемый блок. Поток A ввел бы блок и вставил бы новую строку. Затем после потока выходы блок, B потока ввел бы блок (потому что он не знает то, что просто произошло), и попытка вставить ту же новую строку снова.

Я вижу, что Вы просто изменили код и добавили довольно важную недостающую строку там. В новом коде Вы смогли сходить с рук это, так как два потока не будут полагаться на изменения в общей (статической) переменной. Но Вы могли бы быть более обеспеченным наблюдением, если Ваш DBMS поддерживает оператор такой как INSERT OR UPDATE.

Другое серьезное основание делегировать эту функциональность к DBMS состоит в том, если когда-нибудь необходимо развертывать больше чем один сервер приложений. С тех пор synchronized блоки не работают через машины, необходимо будет сделать что-то еще в этом случае так или иначе.

5
ответ дан 18 December 2019 в 13:20
поделиться

Если Вы испытываете желание написать код как это, рассмотрите:

  • Начиная с Java 1.4 синхронизация методов стала довольно дешевой. Это не свободно, но время выполнения действительно не страдает так очень, что стоит рискнуть повреждением данных.

  • Начиная с Java 1.5 у Вас есть Атомарное* классы, которые позволяют Вам читать и устанавливать поля атомарным способом. К сожалению, они не решают Вашу проблему. То, почему они не добавили AtomicCachedReference или что-то (который назовет переопределяемый метод, когда доберутся () называют, и текущее значение == пустой указатель) вне меня.

  • Попробуйте ehcache. Это позволяет Вам настраивать кэш (т.е. и объект, который позволяет Вам называть код, если ключ не содержится в карте). Это обычно, что Вы хотите, и кэши действительно решают Вашу проблему (и все те другие проблемы, которые Вы не знали, что они даже существовали).

3
ответ дан 18 December 2019 в 13:20
поделиться

Как другие указали, этот код сделает то, что Вы предназначаете, как, но только под строгим рядом неочевидных допущений:

  1. Код Java не кластеризируется (см. @Greg ответ H),
  2. Ссылка "строки" только проверяется на пустой указатель в первой строке перед блоком синхронизации.

Причина перепроверяемая идиома блокировки повреждается (на раздел 16.2.4 из Параллелизма Java на практике) состоит в том, что для потока, выполняющего этот метод возможно видеть непустой указатель, но неправильно инициализированная ссылка на "строку", прежде, чем ввести синхронизируемый блок (если "дао" не обеспечивает надлежащую синхронизацию). Если бы Ваш метод делал что-нибудь со "строкой" кроме проверки, что это является пустым или не, то это было бы повреждено. В настоящий момент это, вероятно, хорошо, но очень хрупкий - лично я не был бы удобной фиксацией этого кода, если бы я думал, что был даже удаленный шанс, что некоторый другой разработчик в некоторое более позднее время мог бы изменить метод, не понимая тонкости DCL.

2
ответ дан 18 December 2019 в 13:20
поделиться
Другие вопросы по тегам:

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