自旋锁学习系列(2):TAS锁

本文介绍了TAS(Test And Set)锁和TTAS(Test, Test And Set)锁的概念,通过Java原子类展示了它们的实现方式。TASLock直接在getAndSet上自旋,而TTASLock在get上自旋以提高性能。在高并发环境下,TTASLock的性能优于TASLock,但解锁时可能导致总线风暴。" 52685496,5004735,卷积神经网络(CNN)详解:降低复杂度,提升泛化能力,"['神经网络', '深度学习', '卷积神经网络']
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值