@Synchronized可以控制方法只能被一个线程执行,我想要的是当方法中传入的其中一个参数相同时,增加控制,不同时放开
时间: 2023-12-29 11:04:46 浏览: 66
你可以使用一个类级别的锁来控制这个方法的并发访问。具体来说,你可以在方法中定义一个静态的 `Map` 对象,用来保存已经被调用过的参数,然后在方法中获取这个 `Map` 对象的锁,根据传入的参数判断是否需要阻塞当前线程,最后释放锁。
以下是一个示例代码:
```java
public class MyClass {
private static final Map<String, Object> PARAMS_LOCK = new HashMap<>();
public void myMethod(String param1, String param2) {
// 获取锁
synchronized (PARAMS_LOCK) {
// 判断是否需要阻塞当前线程
while (PARAMS_LOCK.containsKey(param1) && PARAMS_LOCK.get(param1) != param2) {
try {
PARAMS_LOCK.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
// 执行方法
// ...
// 保存参数
PARAMS_LOCK.put(param1, param2);
}
// 释放锁
synchronized (PARAMS_LOCK) {
PARAMS_LOCK.remove(param1);
PARAMS_LOCK.notifyAll();
}
}
}
```
在这个示例代码中,我们通过一个 `Map` 对象来保存已经被调用过的参数,并且使用这个 `Map` 对象的锁来控制方法的并发访问。在方法中,如果传入的参数已经在 `Map` 对象中存在,就需要判断它对应的值是否与当前传入的值相同,如果不相同就需要阻塞当前线程等待其他线程执行完毕。在执行完毕之后,需要释放锁并且从 `Map` 对象中移除已经执行完毕的参数。
阅读全文