java中的锁

本文探讨了Java中Synchronized的锁优化,包括从偏向锁到轻量级锁再到重量级锁的升级过程,并详细解释了锁的状态转换。同时,分析了乐观锁的核心-CAS操作以及ABA问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.jdk 1.6后Synchronized 锁优化(分级锁)

1. 检测Mark Word里面是不是当前线程ID,如果是,表示当前线程处于偏向锁
2. 如果不是,则使用CAS将当前线程ID替换到Mark Word,如果成功则表示当前线程获得偏向锁,设置偏向标志位1
3. 如果失败,则说明发生了竞争,撤销偏向锁,升级为轻量级锁
4. 当前线程使用CAS将对象头的mark Word锁标记位替换为锁记录指针,如果成功,当前线程获得锁
5. 如果失败,表示其他线程竞争锁,当前线程尝试通过自旋获取锁 for(;;)
6. 如果自旋成功则依然处于轻量级状态
7. 如果自旋失败,升级为重量级锁
   - 索指针:在当前线程的栈帧中划出一块空间,作为该锁的锁记录,并且将锁对象的标记字段复制到改锁记录中!
这里注意  锁状态只能升级不能降级。
     // 修饰普通方法
    public synchronized void method1() {
        // code
    }
    // 修饰静态方法
    public  synchronized static void method2() {
        // code
    }
这里 锁普通方法和锁静态方法的区别是 普通方法中的锁是锁对象,而修饰静态方法是类锁 粒度更大

2.乐观锁和 CAS ABA问题

1-1:乐观锁的实现核心——CAS,它包含了 3 个参数:V(需要更新的变量)、E(预期值)和 N(最新值)。
只有当需要更新的变量等于预期值时,需要更新的变量才会被设置为最新值,如果更新值和预期值不同,则说明已经有其它线程更新了需要更新的变量
,此时当前线程不做操作,返回 V 的真实值。
1-2:通常情况下乐观锁的性能由于悲观锁,不过乐观锁有一定的使用场景,比如:它只能保证单个变量操作的原子性,当涉及到多个变量时,CAS 就无能为力
,适用竞争不激烈的场景
ABA问题是指一个线程修改数据时,获取的最新值是A,在修改之前又有其他的线程将此值做了修改,比如:先改成了B后来又有线程将B改成了A,
但是最早的那个线程是不知道的,还会修改成功的。CAS 没有记录更新时间戳,只是对比更新值和预期值 的值,就会出现ABA 问题
ABA问题的解决思路
1:StampdLock通过获取锁时返回一个时间戳可以解决
2:通过添加版本号,版本号每次修改都增加一个版本,这样也能解决
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值