在Java中,用synchronized关键字分别修饰静态方法和普通实例方法时,两者的锁对象有何不同?请具体说明它们各自的锁定范围。
考察说明
考查synchronized锁机制及锁对象区别。
回答思路
- 【回答框架 1】synchronized修饰普通方法时,锁是当前实例对象(this),即调用该方法的对象,多个线程访问同一实例的该方法时互斥,但访问不同实例则不会互斥。
- 【回答框架 2】synchronized修饰静态方法时,锁是当前类的Class对象,即所有实例共享同一个锁,因此不同实例调用该方法也会互斥。
- 【回答框架 3】两者锁粒度不同:普通方法锁实例,静态方法锁类,需根据线程安全需求选择,例如静态方法可用于保护全局共享状态。
- 【回答框架 4】若需同时控制实例级别和类级别,可分别使用同步块或组合锁,注意锁顺序避免死锁。
- 【关键点 1】普通方法锁this,静态方法锁Class对象。
- 【关键点 2】静态方法锁对所有实例生效,普通方法锁仅对同一实例生效。
- 【关键点 3】锁粒度差异影响并发性能和隔离范围。
- 【易错点 1】混淆锁对象,认为静态方法与实例方法锁相同。
- 【易错点 2】忽略锁粒度差异,导致并发控制不足或过度同步。