发布于2026-07-10 阅读(0)
扫一扫,手机访问
在 Ja va 并发编程里,有个老生常谈的问题:对象锁能不能保护静态成员变量?答案很明确——不能。原因在于对象锁锁的是实例,而静态成员属于类。换句话说,你用 synchronized 修饰一个非静态方法,或者写一段 synchronized(this) 代码块,它锁住的是当前对象本身,和静态变量根本不在同一个维度上。结果就是:多个线程各自拿着自己实例的锁去修改同一个静态变量,毫无互斥可言,形同虚设。
对象锁(即 synchronized 修饰非静态方法或 synchronized(this))锁定的是当前实例(this),而静态成员变量属于类本身,被所有实例共享,与任何具体对象无关。因此,即使多个线程操作不同实例,只要它们修改同一个静态变量,对象锁完全无法形成互斥——每个线程拿到的是各自对象的锁,彼此独立。
静态变量必须由类级别的锁来协调访问,即使用该类的 Class 对象 作为锁载体:
public static synchronized void update() { ... } → 自动以 MyClass.class 为锁synchronized (MyClass.class) { count++; } → 显式、可控、推荐synchronized (this) 或 new Object() → 锁对象不统一,形同虚设一个类可以同时存在对象锁方法和类锁方法,它们使用两把完全不同的锁:
obj1.doInstanceJob()(对象锁)不影响线程 B 调用 MyClass.doStaticJob()(类锁)(学习提示:掌握锁的粒度区别是并发编程的基础,建议通过实际代码验证。)
并非所有静态变量都必须上重量级锁:
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8