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
- compareAndSet(expect, update), 要想更新成功的话,那么这个expect的值一定是1,否则是不会被更新的。
AtomicInteger atomicInteger = new AtomicInteger(1);
atomicInteger.compareAndSet(2, 3);
- 上面的语句,就永远无法把值更新为3。
- 自旋操作: 线程一直在执行逻辑,也就是一直让CPU进行计算操作。