2016-06-03 9 views
1

Мне нужно заблокировать некоторые элементы карты одновременно без перехвата других потоков. Я имею в виду, что я хочу заблокировать 10 элементов, и я думаю, что мне нужно использовать цикл, но я не хочу, чтобы мне удалось заблокировать оставшиеся 5 элементов после того, как я заблокировал пятый элемент. Нужно ли использовать другой независимый от карты блокировку, блокирующий блок блокировки кода?Блокировка элементов карты с помощью Hazelcast

ответ

1

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

Прежде чем вы начнете блокировку, убедитесь, что вы применили некоторый порядок ключей, которые нужно заблокировать (например, естественный порядок, просто используя список и компаратор). В этом случае все блокировки будут получены в том же порядке. Тем не менее вы можете столкнуться с ситуацией, когда, возможно, одна операция приобретет 1, 2, 3, а другая операция приобретет 2, 3, 4. При этом первая операция успешно приобретет 1, но может быть заблокирована на 2.

Вопрос в том, что ваш прецедент? Вероятно, вам лучше использовать другой подход. Если ключи ВСЕГДА принадлежат друг другу, возможно, было бы более полезно применить Data Affinity и использовать EntryProcessor. Для других вариантов использования может быть лучший способ вместо использования нескольких блокировок. Замки обычно представляют собой плохую идею в многопоточных системах, и они не делают ничего лучше в высокопараллельных распределенных системах.