原子操作CAS

    xiaoxiao2022-07-02  95

    一、原子操作 原子操作(atomic operation)不需要 synchronized。原子操作指的是不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch(切换到另一个线程)。

    二、什么是CAS CAS是compare and swap的缩写,即比较交换。CAS是乐观锁。在java中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资源,性能较悲观锁有很大的提高。

    三、CAS算法思想 指令级别保证这是一个原子操作:CAS其底层是通过CPU的1条指令来完成3个步骤,因此其本身是一个原子性操作,不存在其执行某一个步骤的时候而被中断的可能。

    CAS(v, e , n) - v : 表示要更新的变量 - e : 表示变量的预期值 - n : 表示变量的新值 当且仅当 v 的实际值等于 e 值时, 才会将 v 的值设为 n 如果 v 值和 e 值不同,则说明已经有其他线程做了更新,那么当前线程什么都不做,即更新失败。 CAS操作是抱着乐观的态度进行的,它总是认为自己可以成功完成操作。 当多个线程同时使用CAS操作一个变量时,只有一个会胜出,并成功更新,其余均会失败。 失败的线程不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。

    四、CAS的优缺点 优点

    并发量不是很高时CAS机制会提高效率在一般情况下,性能优先于锁的使用

    缺点

    CPU消耗大,CAS线程会不停自旋,如果并发量大的话,将会不停重试,还不释放CPU,极端情况下会耗光资源。只能保证某个变量的原子操作(这里可以用并发包里面的原子更新类AtomicReference实现)ABA问题 (在JAVA并发包里面AtomicStampedReference类用了版本号来解决ABA问题)。它将使调用者处理竞争问题(通过重试、回退、放弃),而在锁中能自动处理竞争问题。

    五 、原子操作类 使用场景 使用原子操作代替synchronized加锁

    最新回复(0)