Synchronized修饰静态方法和修饰普通方法有什么区别呢?
下文笔者讲述"Synchronized修饰静态方法和修饰普通方法"的区别说明,如下所示
`synchronized`修饰"静态方法"和"普通方法(实例方法)主要区别 在于【锁对象不同】 这直接影响线程同步的范围和粒度
1.`synchronized`修饰普通方法(实例方法)
-锁对象:当前类的实例对象(即`this`) -作用范围: 多个线程访问 同一个实例对象的 synchronized方法时互斥例
public class Counter { private int count = 0; public synchronized void increment() { count++; } } 多个线程调用 同一个`Counter`实例`increment()`方法时会同步 但如果创建多个`Counter`实例 则它们之间不会互相阻塞
2.`synchronized`修饰静态方法
-锁对象: 当前类Class对象(即`类名.class`) -作用范围:多个线程访问 该类的所有实例的静态synchronized方法时互斥例
public class Singleton { private static int instanceCount = 0; public static synchronized void createInstance() { instanceCount++; } } 所有线程调用 [createInstance()] 都会互斥执行 即使创建了多个 `Singleton` 实例 也无法并发执行该方法
Synchronized修饰静态方法和修饰普通方法区别对比表
特性 | `synchronized` 普通方法 | `synchronized` 静态方法 |
锁对象 | 当前实例 (`this`) | 类的 Class 对象(`类名.class`) |
同步范围 | 同一个实例的方法调用 | 整个类的所有实例共享 |
是否跨实例同步 | 否 | 是 |
示例场景 | 控制实例变量的并发修改 | 控制静态变量或全局资源的并发访问 |
Synchronized修饰静态方法和修饰普通方法使用场景说明
- 如果你要保护的是 某个对象的状态 , 使用 `synchronized` 修饰 实例方法 。 - 如果你要保护的是 类级别的资源(如静态变量), 则应使用 `synchronized` 修饰 静态方法 或使用 `synchronized(类名.class)`方式控制同步。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。