作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个多线程应用程序,我想在 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/
我是一名优秀的程序员,十分优秀!