Java Striped.lock()的死锁问题
我正在使用Java Striped.lock()的死锁问题,java,guava,Java,Guava,我正在使用com.google.guava.guava-28.0-jre.jar中的Stripe.lock() public class NamedLock { private static final Logger LOGGER = Logger.getLogger(NamedLock.class); private Striped<Lock> locks; public NamedLock() { locks = Strip
com.google.guava.guava-28.0-jre.jar中的Stripe.lock()
public class NamedLock {
private static final Logger LOGGER = Logger.getLogger(NamedLock.class);
private Striped<Lock> locks;
public NamedLock() {
locks = Striped.lock(1023);
}
/**
* Test method
*
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
NamedLock namedLock = new NamedLock();
Runnable runnable = () -> {
namedLock.lock("aAp1h0000004oEcCAI");
try {
TimeUnit.SECONDS.sleep(5);
} catch (Exception e) {
e.printStackTrace();
}
namedLock.lock("aAT1h0000001OzCGAU");
};
new Thread(runnable).start();
TimeUnit.SECONDS.sleep(2);
namedLock.lock("aAp1h0000004oFRCAY");
namedLock.lock("aAp1h0000004oKYCAY");
}
/**
* Acquires the lock for the Names.
*
* @param names
* the Names
*/
public void lock(String... names) {
String key = Arrays.toString(names);
LOGGER.debug("Locking with Key : " + key);
Lock lock = locks.get(key);
LOGGER.debug("Acquiring Lock : " + lock);
lock.lock();
LOGGER.debug("Lock acquired : " + lock);
}
/**
* Releases the lock acquired for the Names.
*
* @param names
* the Names
*/
public void unlock(String... names) {
String key = Arrays.toString(names);
LOGGER.debug("Unlocking with Key : " + key);
Lock lock = locks.get(key);
LOGGER.debug("Releasing Lock : " + lock);
lock.unlock();
LOGGER.debug("Lock released : " + lock);
}
}
程序从不终止并进入死锁状态,等待彼此锁定,尽管所有密钥都不同。来自:
请注意,如果键1不等于键2,则不保证
striped.get(键1)!=条带化。获取(键2)
因此,假设同一条带中存在多个密钥。其中一些散列码的距离相对较近,因此看起来比较合理:
System.out.println("[aAp1h0000004oEcCAI]".hashCode()); // -1286359401
System.out.println("[aAp1h0000004oFRCAY]".hashCode()); // -1273429611
System.out.println("[aAp1h0000004oKYCAY]".hashCode()); // -1123819209
System.out.println("[aAT1h0000001OzCGAU]".hashCode()); // 1694776185
听起来Striped不适用于您的用例,每个对象需要一个锁。来自:
请注意,如果键1不等于键2,则不保证
striped.get(键1)!=条带化。获取(键2)
因此,假设同一条带中存在多个密钥。其中一些散列码的距离相对较近,因此看起来比较合理:
System.out.println("[aAp1h0000004oEcCAI]".hashCode()); // -1286359401
System.out.println("[aAp1h0000004oFRCAY]".hashCode()); // -1273429611
System.out.println("[aAp1h0000004oKYCAY]".hashCode()); // -1123819209
System.out.println("[aAT1h0000001OzCGAU]".hashCode()); // 1694776185
听起来条带化不适用于您的用例,每个对象需要一个锁