在Java中,可以使用ConcurrentHashMap
来实现不同订单号的操作不加锁,同一订单号的操作加锁的需求。以下是一个简单的示例代码:
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
public class OrderLock {
private final ConcurrentHashMap<String, ReentrantLock> lockMap = new ConcurrentHashMap<>();
public void executeOperation(String orderNumber, Runnable operation) {
ReentrantLock orderLock = lockMap.computeIfAbsent(orderNumber, k -> new ReentrantLock());
orderLock.lock();
try {
operation.run();
} finally {
orderLock.unlock();
}
}
}
使用ConcurrentHashMap
的computeIfAbsent
方法,可以保证对于不同的订单号,如果是第一次执行操作,它将创建一个新的ReentrantLock
实例,并将其与订单号关联。之后的执行将重用相同的锁。通过使用ReentrantLock
的lock
和unlock
方法,可以确保同一订单号的操作是互斥执行的。