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)`方式控制同步。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


