agreas 2023-06-21 10:29 采纳率: 0%
浏览 29
已结题

多线程AB互斥,单独访问AB是否可以并发

springboot项目
前提 :现在有两个方法A,B AB方法的底层操作了缓存所以不能同时并发
现在使用了 synchronized (lock) 代码块,AB公用一个lock,测试是没啥问题

现在有的问题是可能有A或者B批量的请求,由于加上锁后无法并发 导致等待有点久.
这块应该怎么改?

补充 :
AB方法操作缓存是调用了其他框架的封装好的接口,改动这块会非常复杂,
现在同步锁是加到AB方法内的操作缓存部分代码

  • 写回答

3条回答 默认 最新

  • 竹山全栈 2023-06-21 10:46
    关注

    可以尝试使用更细粒度的锁,比如针对不同的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可实现更细粒度的锁控制,并提供更强大、灵活的锁控制功能,例如可中断锁和公平锁等。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月10日
  • 修改了问题 6月21日
  • 修改了问题 6月21日
  • 修改了问题 6月21日
  • 展开全部

悬赏问题

  • ¥15 Apache显示系统错误3该如何解决?
  • ¥30 uniapp小程序苹果手机加载gif图片不显示动效?
  • ¥20 js怎么实现跨域问题
  • ¥15 C++dll二次开发,C#调用
  • ¥15 请教,如何使用C#加载本地摄像头进行逐帧推流
  • ¥15 Python easyocr无法顺利执行,如何解决?
  • ¥15 求一个十多年前的国产符号计算软件(MMP)+用户手册
  • ¥15 为什么会突然npm err!啊
  • ¥15 java服务连接es读取列表数据,服务连接本地es获取数据时的速度很快,但是换成远端的es就会非常慢,这是为什么呢
  • ¥15 vxworks交叉编译gcc报错error: missing binary operator before token "("