PutMessageLock、PutMessageSpinLock、PutMessageReentrantLock 自旋锁的实现以及可重入锁实现

PutMessageLock、PutMessageSpinLock、PutMessageReentrantLock 自旋锁的实现以及可重入锁实现

说明

PutMessageLock :锁的接口
PutMessageReentrantLock:可重入锁的实现
PutMessageSpinLock: 自旋锁的实现

源码很简单直接贴

源码

接口PutMessageLock

public interface PutMessageLock {
    void lock();

    void unlock();
}

重入实现PutMessageReentrantLock

public class PutMessageReentrantLock implements PutMessageLock {
    private ReentrantLock putMessageNormalLock = new ReentrantLock(); // NonfairSync

    @Override
    public void lock() {
        putMessageNormalLock.lock();
    }

    @Override
    public void unlock() {
        putMessageNormalLock.unlock();
    }
}

自旋实现PutMessageSpinLock

public class PutMessageSpinLock implements PutMessageLock {
    //true: Can lock, false : in lock.
    private AtomicBoolean putMessageSpinLock = new AtomicBoolean(true);

    @Override
    public void lock() {
        boolean flag;
        do {
            flag = this.putMessageSpinLock.compareAndSet(true, false);
        }
        while (!flag);
    }

    @Override
    public void unlock() {
        this.putMessageSpinLock.compareAndSet(false, true);
    }
}

重入锁和自旋锁的区别

网上资料很多,简单来说,自旋锁不能先锁两次再释放两次,而重入锁可以

compareAndSet(CAS, 自旋锁)理解

  • CAS compareAndSet,compareAndExchange,compareAndSwap
    这个函数会先进行比较,如果相比较的两个值是相等的,那么就进行更新操作。
  • CAS使用场景
AtomicInteger atomicInteger = new AtomicInteger(1);
atomicInteger.compareAndSet(1, 2);

  1. 初始值是1
  2. compareAndSet(expect, update), 要想更新成功的话,那么这个expect的值一定是1,否则是不会被更新的。
AtomicInteger atomicInteger = new AtomicInteger(1);
atomicInteger.compareAndSet(2, 3);
  1. 上面的语句,就永远无法把值更新为3。
  • 自旋操作: 线程一直在执行逻辑,也就是一直让CPU进行计算操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一名技术极客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值