我有一个集群程序,每个线程都要锁定一组密钥。 据我了解使用hazelcast的最简单的解决方案:
private void lock(SortedSet<String> objects) {
try {
IMap<String, String> lockMap = getLockMap();
for (; ; ) {
SortedSet<String> lockedObjects = new TreeSet<>();
for (String object : objects) {
try {
boolean locked = lockMap.tryLock(object, 0, null, maxBlockTime, TimeUnit.MILLISECONDS);
if (locked) {
lockedObjects.add(object);
} else {
for (String lockedObject : lockedObjects) {
lockMap.unlock(lockedObject);
}
lockedObjects.clear();
break;
}
} catch (Exception e) {
for (String lockedObject : lockedObjects) {
try {
lockMap.unlock(lockedObject);
} catch(Exception ignored) {
}
}
throw e;
}
}
if (!lockedObjects.isEmpty()) {
return lockedObjects;
}
Thread.sleep(waitTime);
}
}
}
此代码的主要问题是此代码生成大量网络流量并要求进行淡化广播。有人可以推荐如何优化此代码吗?
我无法在Hazelcast IMap中找到批量tryLock功能。
答案 0 :(得分:0)
Hazelcast不提供bulkLock
方法。
您可以通过各种方式优化此代码,但在我们开始之前,了解您为什么要锁定这些条目以及您要实现的目标将非常棒。