如何保护方法避免并发调用?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
相关产品推荐
相关产品推荐

