You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保护方法避免并发调用?synchronized能否保证排他执行?

关于synchronized方法跨实例调用的互斥性问题

你的问题核心其实要看这三个Activity调用Class A中方法时,使用的是同一个A类实例还是不同的实例——这直接决定了synchronized实例方法能不能帮你实现全局互斥:

情况1:三个Activity共用同一个Class A实例

这种情况下,synchronized实例方法完全能达到你想要的效果。

因为实例方法的synchronized关键字,本质是把当前对象实例作为锁(也就是this对象)。不管调用这个方法的线程来自哪个Activity,只要它们操作的是同一个A实例,就必须先获取这个实例的内置锁才能执行方法逻辑。同一时刻只有一个线程能拿到锁,其他线程会进入阻塞状态,直到锁被释放。

情况2:三个Activity各自使用独立的Class A实例

这种情况下,synchronized实例方法无法保证全局互斥。

每个A类实例都有自己独立的内置锁,三个Activity用各自的实例调用方法时,它们争抢的是不同的锁,相互之间没有约束,很可能出现多个线程同时执行该方法的情况。

如果你需要全局互斥(不管用哪个实例调用)

可以用下面两种方案解决:

  • 改成静态synchronized方法:静态方法的synchronized锁是绑定到A.class这个Class对象上的,全局唯一。不管你创建多少个A类实例,调用静态synchronized方法时都会争抢同一个锁,自然能保证同一时刻只有一个线程执行。示例代码:

    public class A {
        public static synchronized void yourKeyMethod() {
            // 关键任务逻辑
        }
    }
    
  • 使用全局共享锁对象:在A类中定义一个静态的锁对象,然后在方法内部用synchronized块包裹核心逻辑。示例代码:

    public class A {
        // 全局唯一的锁对象
        private static final Object GLOBAL_LOCK = new Object();
    
        public void yourKeyMethod() {
            synchronized(GLOBAL_LOCK) {
                // 关键任务逻辑
            }
        }
    }
    

这样不管三个Activity用的是同一个还是不同的A实例,都会争抢同一个锁,确保同一时刻只有一处执行关键代码。

内容的提问来源于stack exchange,提问作者Ehsan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:04:14