2015-08-26 3 views
1

По кластерной среде я имею в виду тот же код работает на множественном сервере machines.My сценарий, что я могу думать о том, как следуетКак синхронизировать блок обрабатывается в кластерной среде

Multiple запрос пришел, чтобы обновить данные кредитной карты на основе истечения срока из разных потоков одновременно. Фрагмент кода следующий

synchronized(card) { //card object 
if(card.isExpired()) 
updateCard() 
} 

Мое понимание синхронизированный блок работает на уровне JVM, так как в многосерверной среде это достигается.

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

+0

В общем, тяжело ответить. Возможно, вам захочется добавить дополнительную информацию о проблеме, которую вы пытаетесь решить (глобальная блокировка, вероятно, не очень хорошая идея), чтобы дать более конкретные ответы. – dhke

+0

В кластерном (и даже в некластеризованной среде) вы не будете полагаться на синхронизацию, а на изоляцию транзакций и пессимистичную или оптимистичную блокировку базы данных. –

+1

Когда вы блокируете объект, вы блокируете объект, находящийся в этой JVM. JVM не имеет понятия, что вы намерены заблокировать все экземпляры этого объекта во всех JVM. –

ответ

2

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

Далее, придя к вашему фактическому вопросу, если у вас есть один запрос на обслуживание jvm, тогда все остальные потоки должны будут ждать, чтобы получить эту блокировку. Если у вас запущено несколько JVM, блокировка, полученная одним потоком на одном JVM, не будет препятствовать приобретению (в действительности, не такой же, но концептуально такой же) блокировки другим потоком в другом jvm.

+1

Да, beacuse syncronized block связан с JVM, а не с окружающей средой. –

1

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

1

Как вы сказали, синхронизированный блок предназначен только для потоков «локального JVM». Когда дело доходит до кластера, зависит от вас, как вы управляете распределенной транзакцией.

Это действительно зависит от того, где хранятся ваши объекты (например, карта).

  • База данных - вам, вероятно, потребуется использовать некоторую стратегию блокировки. Очень вероятная оптимистическая блокировка, которая хранит версию объекта и проверяет ее при каждом изменении. Или более «безопасная» пессимистическая блокировка, при которой вы блокируете всю строку при внесении изменений.
  • Память. Вам, вероятно, понадобится какое-то решение для решетки памяти (например, Hazelcast ...) и использовать его поддержку транзакций или реализовать его самостоятельно
  • Любые другие? У вас будет указать ...
Смежные вопросы