TAS 是test and set 的缩写,直白的翻译过来就是比较然后测试。java中的原子类大量使用了TAS操作。通过TAS 我们可以安全并且无阻塞的设置原子变量,不用加锁也能进行线程安全的操作。本文目的不是谈原子变量的使用和实现原理的,这个以后会单独来讲。我们主要来看如何使用TAS操作来实现互斥锁。
首先让我们来看看最简单的一种实现TASLock,废话少说直接上代码:
//test and set lock
public class TASLock {
private AtomicBoolean state = new AtomicBoolean(false);
// 加锁
public void lock() {
while (state.getAndSet(true)) {
}
}
// 解锁
public void unlock() {
state.set(false);
}
}
这应该是互斥锁的最简单的实现了吧,加锁和解锁只需要一行有效代码。让我们详细来分析一下TASLock类。TASLock有一个AtomicBoolean类型的字段state,我们用这个字段来标示锁的状态,初始值为false。state为true说明锁已经被某个线程占有,fase则说明锁空闲。AtomicBoolean是布尔值的一个原子类型实现类。关于原子类型的原理和使用场景以后单独写一篇来讲,不是这篇的主要目的。目前只要知道原子类型的方法是线程安全的就ok了。我们再来看一下代码中调用state的两个方法:
(1)getAndSet ,这个方法是设置state的值为参数值&#x