Synchronized的“特性保证”

26 篇文章 0 订阅

1. 互斥性(Mutual Exclusion)

  • 定义:synchronized确保了同一时刻只有一个线程可以执行被其修饰的代码块或方法,即多个线程在访问共享资源时不会发生冲突。
  • 源码分析:在JVM中,synchronized的实现依赖于Java对象头中的Mark Word和Monitor对象。当一个线程尝试进入synchronized代码块时,JVM会检查Mark Word中的锁状态。如果锁状态为无锁,则JVM会将当前线程的ID写入Mark Word,并将锁状态设置为偏向锁或轻量级锁。如果锁已被其他线程持有,则当前线程会被阻塞,直到锁被释放。
  • 作用:通过互斥性,synchronized确保了共享资源在同一时间只被一个线程访问,避免了数据不一致的问题。

2. 可见性(Visibility)

  • 定义:synchronized保证了共享变量的修改对其他线程是可见的。
  • 源码分析:当一个线程释放锁时,JVM会将对共享变量的修改刷新到主内存中。其他线程在获取锁时会从主内存中重新读取该变量的值,从而确保了变量值的可见性。这种机制避免了线程之间由于缓存不一致而导致的数据问题。
  • 作用:可见性确保了线程之间对共享变量的修改是同步的,从而保证了数据的一致性。

3. 原子性(Atomicity)

  • 定义:被synchronized修饰的方法或代码块的所有操作都是原子性的,即它们要么全部执行,要么全部不执行。
  • 源码分析:synchronized通过获取和释放锁来确保操作的原子性。当一个线程执行synchronized代码块时,它会先获取锁,然后执行代码块中的操作。在执行过程中,其他线程无法获取锁,因此无法进入该代码块。只有当该线程释放锁后,其他线程才有机会执行该代码块。
  • 作用:原子性避免了多线程环境下因线程切换导致的操作中断和数据不一致问题。

4. 可重入性(Reentrant)

  • 定义:同一个线程可以多次获得同一个对象的锁。
  • 源码分析:当一个线程已经持有某个对象的锁时,它可以再次进入该对象的synchronized代码块或方法,而不会导致死锁。JVM在检查锁状态时,会识别出当前线程已经持有该锁,从而允许其继续执行。
  • 作用:可重入性避免了因线程递归调用导致的死锁问题,提高了代码的灵活性和可维护性。

5. 总结

synchronized作为Java中强大的多线程同步机制,通过互斥性、可见性、原子性和可重入性等特性,确保了多线程环境下数据的一致性和操作的完整性。在源码层面,synchronized的实现依赖于Java对象头中的Mark Word和Monitor对象,通过获取和释放锁来实现对共享资源的同步访问。深入理解synchronized的特性和源码实现,对于提高Java多线程编程的效率和安全性具有重要意义。同时,通过合理的使用synchronized,可以更好地控制多线程之间的协作和竞争,实现高效、稳定的并发程序。


  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BrightChen666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值