gpt4 book ai didi

java - 如何重构基于字符串的同步块(synchronized block)

转载 作者:行者123 更新时间:2023-11-29 04:56:59 24 4
gpt4 key购买 nike

我正在重构一个遗留项目,我发现了一个使用 String 进行同步的代码(实际上它是一个 Cache 实现)。

public void method (String key, ...) {

synchronized(key) {
....
}
}

只有一个 block 在字符串对象 key 上同步。

我想知道修复/重构代码的最佳方法是什么?

有什么想法吗?

最佳答案

一种方法是使用以下模式:

private final ConcurrentHashMap<String, Object> lockMap = new ConcurrentHashMap<>();
public void method(String key, ...) {
synchronized(getLock(key)) {
....
}
}
protected Object getLock(String key) {
Object newLock = new Object(), lock = lockMap.putIfAbsent(key, newLock);
return lock == null? newLock: lock;
}

请注意,这是一个经过验证的模式,因为 Java 7 引入的并行类加载器也使用它。

使用 Java 8,您可以简化代码:

protected Object getLock(String key) {
return lockMap.computeIfAbsent(key, x->new Object());
}

关于java - 如何重构基于字符串的同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33426036/

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