Java中的原子内置锁-synchronized

目录

什么是Synchoronized?

Synchoronized的基本概念

Synchoronized的底层实现

Monitor

锁升级

无锁 

偏向锁

轻量级锁

重量级锁

Java中其他相关锁

乐观锁-悲观锁 

共享锁-排他锁

公平锁-非公平锁

可重入锁


什么是Synchoronized?

Synchoronized的基本概念

        Synchoronized是Java实现线程同步中一个很关键的机制之一,它用于一个共享数据不能被多个线程同时访问,防止出现数据不一致等风险。Synchronized可以作用于代码块和方法,保证在同一时刻只能有一个线程执行代码块或方法。

Synchoronized的底层实现

        Synchoronized是java的原子性内置锁,他是JVM级别和操作系统级别的,这里涉及到锁升级。Synchoronized的底层是一个监视者(Monitor)实现的。主要是在编译之后在同步的代码块前面加上monitorentermonitorexit。在线程进入代码块时获取锁,获取锁成功之后,其他线程将会进入到等待队列当中。执行完monitorexit之后,锁释放。

Monitor

锁升级

   锁升级(Lock Escalation) 过程涉及 4 种锁状态,JVM 会根据线程竞争情况动态调整锁的级别,随着锁的重量不断增加,性能也在不断下降,但是会越来越安全。

无锁 

        对象的时候,此时没有任何的竞争,此时是无锁。对象头标记001。

偏向锁

        当有第一个线程访问的时候,此时从无锁升级到了偏向锁,对象头标记101.

轻量级锁

        多线程之间交替执行,竞争并不激烈,可通过自旋锁调节,对象头标记01。

重量级锁

        多线程之间竞争激烈,长时间自旋锁失败。此时升级到重量级锁,同时从用户态切换为内核态。因为此时涉及到操作系统级别。重量级锁由monitor实现。对象头标记10.

Java中其他相关锁

乐观锁-悲观锁 

  • 乐观锁:假设并发冲突较少,不加锁,而是在 提交修改时检查数据是否被其他线程修改过(通常用 CAS 或 版本号机制)。适用场景:读多写少、冲突概率低的场景。
  • 悲观锁:假设并发冲突一定会发生,因此在访问共享资源前 先加锁,确保独占访问。

    适用场景:写操作多、竞争激烈的场景。

共享锁-排他锁

  • 共享锁:多个线程可以 同时持有读锁,适用于 读多写少 的场景。
  • 特点

    • 读操作不互斥,提高并发性。

    • 写操作会被阻塞,直到所有读锁释放。

  • 排他锁:同一时间 只有一个线程能持有写锁,适用于 写操作

  • 特点

    • 写锁会阻塞其他所有读锁和写锁。

    • 保证数据一致性。

公平锁-非公平锁

  • 公平锁:线程按照 申请锁的顺序 获取锁(先到先得)
  • 非公平锁:线程 插队竞争锁,不保证顺序。

可重入锁

  • 同一个线程可以 多次获取同一把锁(避免死锁)。

  • 特点

    • 锁的获取次数必须和释放次数匹配。

    • 适用于递归调用或嵌套同步块。


      本文相关图片资源来自于网络中,如有侵权请联系删除!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值