springboot项目
前提 :现在有两个方法A,B AB方法的底层操作了缓存所以不能同时并发
现在使用了 synchronized (lock) 代码块,AB公用一个lock,测试是没啥问题
现在有的问题是可能有A或者B批量的请求,由于加上锁后无法并发 导致等待有点久.
这块应该怎么改?
补充 :
AB方法操作缓存是调用了其他框架的封装好的接口,改动这块会非常复杂,
现在同步锁是加到AB方法内的操作缓存部分代码
springboot项目
前提 :现在有两个方法A,B AB方法的底层操作了缓存所以不能同时并发
现在使用了 synchronized (lock) 代码块,AB公用一个lock,测试是没啥问题
现在有的问题是可能有A或者B批量的请求,由于加上锁后无法并发 导致等待有点久.
这块应该怎么改?
补充 :
AB方法操作缓存是调用了其他框架的封装好的接口,改动这块会非常复杂,
现在同步锁是加到AB方法内的操作缓存部分代码
可以尝试使用更细粒度的锁,比如针对不同的A或B方法,分别声明不同的锁对象。好处是,只有在需要操作共享资源的代码块中使用锁,其他代码块则可以并发执行,案例代码如下
class MyClass {
private final Object lockA = new Object();
private final Object lockB = new Object();
public void methodA() {
synchronized(lockA) {
// 操作共享资源的代码块
}
}
public void methodB() {
synchronized(lockB) {
// 操作共享资源的代码块
}
}
}
以上代码即使A和B方法并发调用,它们也不会因为共用一个锁而等待对方执行完,从而提高了系统的并发性能。
考虑使用可重入锁ReentrantLock
代替synchronized
关键字。ReentrantLock
可实现更细粒度的锁控制,并提供更强大、灵活的锁控制功能,例如可中断锁和公平锁等。