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
听起来条带化不适用于您的用例,每个对象需要一个锁