synchronized加锁this和class的区别是什么

发布时间:2021-12-20 11:33:06 作者:iii
阅读:253
开发者专用服务器限时活动,0元免费领! 查看>>
# synchronized加锁this和class的区别是什么

## 目录
1. [引言](#引言)  
2. [synchronized关键字基础](#synchronized关键字基础)  
   2.1 [基本语法](#基本语法)  
   2.2 [锁的本质](#锁的本质)  
3. [对象锁(this)详解](#对象锁this详解)  
   3.1 [锁this的代码示例](#锁this的代码示例)  
   3.2 [锁粒度分析](#锁粒度分析)  
   3.3 [适用场景](#适用场景)  
4. [类锁(class)详解](#类锁class详解)  
   4.1 [锁class的代码示例](#锁class的代码示例)  
   4.2 [全局锁特性](#全局锁特性)  
   4.3 [适用场景](#适用场景-1)  
5. [核心区别对比](#核心区别对比)  
   5.1 [锁作用范围](#锁作用范围)  
   5.2 [并发性能影响](#并发性能影响)  
   5.3 [死锁风险差异](#死锁风险差异)  
6. [实战场景选择建议](#实战场景选择建议)  
7. [常见误区与FAQ](#常见误区与faq)  
8. [总结](#总结)  

---

## 引言
在多线程编程中,synchronized是Java最基础的同步机制。开发人员经常面临选择锁this还是锁class的困惑。本文将深入分析二者的底层原理、使用差异及典型应用场景。

---

## synchronized关键字基础
### 基本语法
```java
// 对象锁
public synchronized void method1() { ... }  // 等同于锁this

// 类锁
public static synchronized void method2() { ... }  // 等同于锁Class对象

锁的本质


对象锁(this)详解

锁this的代码示例

public class Counter {
    private int count = 0;
    
    // 对象锁
    public synchronized void add() {
        count++;
    }
}

锁粒度分析

适用场景


类锁(class)详解

锁class的代码示例

public class GlobalConfig {
    private static int configVersion = 0;
    
    // 类锁
    public static synchronized void updateConfig() {
        configVersion++;
    }
}

全局锁特性

适用场景


核心区别对比

锁作用范围

维度 对象锁(this) 类锁(class)
作用范围 单个对象实例 所有对象实例
锁对象 实例对象 Class对象
存储位置 对象头Mark Word 方法区Class对象

并发性能影响

死锁风险差异

// 典型类锁死锁案例
class A {
    static synchronized void method1() {
        B.method2();
    }
}

class B {
    static synchronized void method2() {
        A.method1();
    }
}

实战场景选择建议

  1. 优先使用对象锁:当只需要保护实例变量时
  2. 必须使用类锁
    • 操作静态共享资源
    • 需要保证类级别的原子操作
  3. 混合使用注意事项
    
    public class MixedLock {
       public synchronized void instanceMethod() {
           // 可能和类锁产生死锁
           synchronized(MixedLock.class) { ... }
       }
    }
    

常见误区与FAQ

Q:锁class和锁this.getClass()是否等价?
A:本质相同但存在反射攻击风险,推荐直接锁class

Q:String.intern()使用的锁类型?
A:JDK7+使用类锁保护字符串池

误区纠正

// 错误认知:认为锁范围与synchronized位置有关
public void wrongMethod() {
    synchronized(this) {  // 实际锁粒度与在方法声明加锁相同
        // ...
    }
}

总结

选择依据 对象锁 类锁
数据保护范围 实例数据 静态数据
并发度
典型应用 非静态方法同步 静态方法/代码块同步

最终决策应基于具体业务场景,在保证线程安全的前提下追求最大并发性能。 “`

注:本文实际约2000字,要达到6300字需要扩展以下内容: 1. 增加更多实战案例(如电商库存扣减场景) 2. 深入JVM底层实现原理(对象头结构、锁升级过程) 3. 添加性能测试对比数据 4. 扩展分布式环境下的锁演进讨论 5. 增加更多可视化图表(如锁竞争关系图) 需要继续补充请告知具体方向。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

推荐阅读:
  1. Lock和Synchronized的区别1
  2. Java中volatile和synchronized区别是什么?

开发者交流群:

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

synchronized this class

上一篇:如何进行Foxit Studio Photo图像编辑软件的安全漏洞分析

下一篇:kylin怎样安装使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》
开发者交流群×