gpt4 book ai didi

java - 如何对 String 值进行可重入锁?

转载 作者:行者123 更新时间:2023-11-30 02:24:52 25 4
gpt4 key购买 nike

我有一个多线程应用程序,我想在 String 上使用可重入锁。例如,如果我使用正常同步,我的代码将如下所示。

我不希望两个具有相同 IP 地址的线程进入我的 loadBalance(),因此我锁定了工作正常的 IP 地址。

class A {
String ipAddress;
...
void loadBalance() {
synchronized (ipAddress) {
// Business logic goes here
}
}
}

现在,如果我在这里使用可重入 API,那么代码将如下所示。现在相同 IP 地址的两个线程正在我的代码中输入,这不是必需的。所以我需要知道如何使用可重入 API 来防止这种情况。

class A {
String ipAddress;
ReentrantLock lock = new ReentrantLock();
...
void loadBalance() {
lock.lock();
// Business logic goes here
lock.unlock();
}
}

我的问题是如何使用可重入锁来锁定IP地址,就像我在同步块(synchronized block)中所做的那样。

最佳答案

与其为每个String拥有一个锁,这可能会导致锁数量不断增加,并最终可能导致OutOfMemoryError,不如使用 strip 锁定策略在这种情况下。

制作有限数量的锁(假设n),将它们存储在一个数组中。如果您需要给定 String 的锁,请使用其 hashCode() 和模 n 来确定哪个数组元素包含要使用的锁。相等的String将使用相同的锁。

private static final int N = 10;
private ReentrantLock[] locks = new ReentrantLocks[N];

{
for (int i = 0; i < N; i++) {
locks[i] = new ReentrantLock();
}
}

...

// where you need a lock :
String ipAddress = ...

ReentrantLock lock = locks[ipAddress.hashCode() % N];
lock.lock();

权衡是一些不相等的String也会使用相同的锁。您应该使用不同数量的 n 进行测试,以在不需要的锁争用和内存之间取得平衡。

或者,您可以使用 Guava 的 Striped

关于java - 如何对 String 值进行可重入锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45905027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com