2015-10-01 1 views
1

Мне нужно обновить приложение, которое использует старую версию hazelcast для одной из последних версий. Была некоторая функция блокировки орешника, которая с тех пор устарела и полностью удалена из API. В частности, старые функциональные возможности блокировки работали как таковой:Как использовать замок из лесного камня

Hazecast.getLock(myString); 

Функция getLock был статический метод на Hazelcast. Теперь его нужно заменить чем-то вроде:

hazelcastInstance.getLock(myString); 

... где замок происходит от одного из экземпляров кластера.

Вопрос в том, могу ли я использовать любой из экземпляров в кластере ящерицы, чтобы получить блокировку? И если так, будет ли это блокировать все экземпляры?

+0

если пост ниже помог вам или ответить на Ваш вопрос, пожалуйста, примите его как ответ. Если у вас есть последующие вопросы, не стесняйтесь публиковать его тоже. – Dinesh

ответ

3

Q1: Да, вы можете использовать любой из экземпляров в кластере из лесного камня, чтобы получить блокировку (ILock).

Вы можете думать о ILock в каркасе из орехового дерева как распределенная реализация java.util.concurrent.locks.Lock. Для получения более подробной информации см

http://docs.hazelcast.org/docs/3.5/javadoc/com/hazelcast/core/ILock.html

Q2: Если заблокировать критическую секцию, используя ILock, то охраняемый критический участок гарантированно будет выполняться только одним потоком во всем кластере в данный момент времени , Таким образом, как только метод lock() вызывается, например, Thread1 в одном узле, другие потоки (в других узлах также) будут ждать, пока блокировка не будет отпущена.

Пример кода:

HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance(); 
Lock testLock = hazelcastInstance.getLock("testLock"); 
testLock.lock(); 
try 
{ 
    // critical section code. 
} 
finally 
{ 
    testLock.unlock(); 
}