热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

【BeautifulJUCPart.6】CAS不可中断的典范

【BeautifulJUCPart.6】CAS不可中断的典范一、什么是CAS运用场合:并发场景,实现不能被打断的交换操作主要思路:我认为V的值应该是A,如果是的话那我就把它改成B,

【Beautiful JUC Part.6】CAS 不可中断的典范

一、什么是CAS

image-20220209224926261

运用场合:并发场景,实现不能被打断的交换操作

主要思路:



  • 我认为V的值应该是A,如果是的话那我就把它改成B,如果不是A(说明被别人修改过了),那我就不修改了,避免多人同时修改导致出错。

  • CAS有三个操作数:

    • 内存值V、预期值A、要修改的值B,当且仅当预期值A和内存值V相同时,才将内存值修改为B,否则什么都不做。最后返回现在的V值



  • CPU的特殊指令

    • 一个指令可以比较和赋值




二、CAS的等价代码、应用场景


1、演示案例

public class TwoThreadsCompetition implements Runnable{
private volatile int value;
public synchronized int compareAndSwap(int expectedValue, int newValue) {
int oldValue = value;
if (oldValue == expectedValue) {
value = newValue;
}
return oldValue;
}
@Override
public void run() {
compareAndSwap(0, 1);
}
public static void main(String[] args) throws InterruptedException {
TwoThreadsCompetition r = new TwoThreadsCompetition();
r.value = 0;
Thread t1 = new Thread(r, "线程1");
Thread t2 = new Thread(r, "线程2");
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(r.value);
}
}

模拟CAS操作


2、应用场景



  • 乐观锁

  • 并发容器

    • concurrentHashMap



  • 原子类


3、分析原子类的CAS

AtomicInteger类

image-20220209230247385

AtomicInteger加载Unsafe工具,用来直接操作内存数据

用Unsafe来实现底层操作

用volatile修饰value字段,保证可见性

getAndAddInt方法分析

image-20220209230453848


Unsafe类

image-20220209230555278


总结

image-20220209230751403


三、CAS的缺点


1、ABA问题

因为CAS只是做和原值相不相等的检查,并没有检查是否被修改。

假设有三个线程,原值是5,线程2把5改为7,线程3又把7改成5,等到第一个线程查看是否是5,发现真的是5,线程1以为没有任何线程对其进行修改,所以线程1就会把这个5改成所期待的值。但是实际上已经有人修改过了。


2、如何解决

可以添加版本号,比如说第一个版本的5,第二个版本的5


3、自旋时间过长

在原子类的getAndAddInt方法中可以看到,一直在cas部分自旋,如果一直等待锁,就会造成消耗资源的问题。



推荐阅读
  • 春季职场跃迁指南:如何高效利用金三银四跳槽季
    随着每年的‘金三银四’跳槽高峰期的到来,许多职场人士都开始考虑是否应该寻找新的职业机会。本文将探讨如何制定有效的职业规划、撰写吸引人的简历以及掌握面试技巧,助您在这关键时期成功实现职场跃迁。 ... [详细]
  • 本文汇集了作者在准备研究生入学考试过程中的心得体会,包括备考策略、复习重点及应对考试的心理调适技巧,旨在为即将参加考研的学生提供实用建议。 ... [详细]
  • HDFS数据读写流程详解
    本文详细解析了HDFS(Hadoop分布式文件系统)中的数据读写过程,包括从客户端发起请求到最终完成数据传输的每一个关键步骤。 ... [详细]
  • 本文探讨了服务器系统架构的性能评估方法,包括性能评估的目的、步骤以及如何选择合适的度量标准。文章还介绍了几种常用的基准测试程序及其应用,并详细说明了Web服务器性能评估的关键指标与测试方法。 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • WebBenchmark:强大的Web API性能测试工具
    本文介绍了一款名为WebBenchmark的Web API性能测试工具,该工具不仅支持HTTP和HTTPS服务的测试,还提供了丰富的功能来帮助开发者进行高效的性能评估。 ... [详细]
  • 深入理解线程池及其基本实现
    本文探讨了线程池的概念、优势及其在Java中的应用。通过实例分析不同类型的线程池,并指导如何构建一个简易的线程池。 ... [详细]
  • Pacing设置在性能测试中扮演着至关重要的角色,它直接影响到模拟用户行为的真实性和测试结果的准确性。本文将探讨Pacing设置的不同方法及其应用场景,帮助测试人员更好地理解和利用这一功能。 ... [详细]
  • 本文详细探讨了在Java TCP编程中,如何理解和测量并发连接数、请求数及并发用户数,并提供了实际应用中的测试方法和优化建议。 ... [详细]
  • Zabbix自定义监控与邮件告警配置实践
    本文详细介绍了如何在Zabbix中添加自定义监控项目,配置邮件告警功能,并解决测试告警时遇到的邮件不发送问题。 ... [详细]
  • TCP协议中的可靠传输机制分析
    本文深入探讨了TCP协议如何通过滑动窗口和超时重传来确保数据传输的可靠性,同时介绍了流量控制和拥塞控制的基本原理及其在实际网络通信中的应用。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • flea,frame,db,使用,之 ... [详细]
author-avatar
Borisyu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有