什么是原子操作?如何实现原子操作?

假定有两个操作 A 和 B,如果从执行 A 的线程来看,当另一个线程执行 B 时, 要么将 B 全部执行完,要么完全不执行 B,那么 A 和 B 对彼此来说是原子的。

实现原子操作可以使用锁,锁机制,满足基本的需求是没有问题的了,但是 有的时候我们的需求并非这么简单,我们需要更有效,更加灵活的机制, synchronized 关键字是基于阻塞的锁机制,也就是说当一个线程拥有锁的时候, 访问同一资源的其它线程需要等待,直到该线程释放锁,这里会有些问题:首先,如果被阻塞的线程优先级很高很重要怎么办?其次, 如果获得锁的线程一直不释放锁怎么办?(这种情况是非常糟糕的)。还有一种 情况,如果有大量的线程来竞争资源,那 CPU 将会花费大量的时间和资源来处 理这些竞争,同时,还有可能出现一些例如死锁之类的情况,最后,其实锁机制 是一种比较粗糙,粒度比较大的机制,相对于像计数器这样的需求有点儿过于笨 重。

实现原子操作还可以使用当前的处理器基本都支持 CAS()的指令,只不过每 个厂家所实现的算法并不一样,每一个 CAS 操作过程都包含三个运算符:一个内 存地址 V,一个期望的值 A 和一个新值 B,操作的时候如果这个地址上存放的值 等于这个期望的值 A,则将地址上的值赋为新值 B,否则不做任何操作。

CAS 的基本思路就是,如果这个地址上的值和期望的值相等,则给其赋予新 值,否则不做任何事儿,但是要返回原值是多少。循环 CAS 就是在一个循环里不 断的做 cas 操作,直到成功为止。

CAS 是怎么实现线程的安全呢?语言层面不做处理,我们将其交给硬件— CPU 和内存,利用 CPU 的多处理能力,实现硬件层面的阻塞,再加上 volatile 变 量的特性即可实现基于原子操作的线程安全。

java多线程原子操作_Java 多线程 - 原子操作CAS相关推荐

  1. java并发多线程面试_Java多线程并发面试问答

    java并发多线程面试 Today we will go through Java Multithreading Interview Questions and Answers. We will al ...

  2. java的多线程机制_Java多线程开发(一)| 基本的线程机制

    0. 前言 Java 为了实现跨平台,在语言层面上实现了多线程.我们只需要熟悉 Java 这一套多线程机制就行了,比 C/C++ 要容易多了. 1. 定义任务 我们编写程序,最终是为了完成特定的任务. ...

  3. java线程钥匙_Java多线程并发编程/锁的理解

    一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...

  4. java线程 教程_Java多线程系列教程

    Java多线程系列教程 多线程是Java中不可避免的一个重要主体.从本章开始,我们将展开对多线程的学习.接下来的内容是对Java多线程内容的讲解,涉及到的内容包括,Object类中的wait(), n ...

  5. java 多线程 总结_Java 多线程总结

    昨天熬了个通宵,看了一晚上的视频,把java 的多线程相关技术重新复习了一遍,下面对学习过程中遇到的知识点进行下总结. 首先我们先来了解一下进程.线程.并发执行的概念: 进程是指:一个内存中运行的应用 ...

  6. java线程入门_java多线程快速入门(一)

    1.什么是进程 比如:QQ.QQ游戏.eclipse都是进程,可以通过任务管理器查看进程 2.进程和线程区别 线程是进程的一部分,一个进程可以包含多个线程,一个线程只能属于一个进程 进程是所有线程的集 ...

  7. java 高效的多线程同步_java多线程的同步和异步

    java多线程的同步和异步 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算 ...

  8. java 线程 组成_java多线程

    一:基本知识点 1.1线程与进程区别: 1.进程是资源分配的最小单位,线程是CPU调度的最小单位 2.一个进程由一个或多个线程组成 3.进程之间相互独立,每个进程都有独立的代码和数据空间,但同一进程下 ...

  9. java 多线程全局变量_Java多线程操作局部变量与全局变量

    在这篇文章里,我们首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控制同步,接下来我们会仿照回顾网络通信时那样,构建一个服务器端的"线程池",JDK为我们提供了一个很 ...

最新文章

  1. php中final关键字
  2. mysql UNIX时间戳与日期的相互转换
  3. 【项目实战】基于随机森林算法的房屋价格预测模型
  4. IDEA开发vue.js卡死问题
  5. IOS多线程之Block编程
  6. JAVA构造函数是不是封装_Java 封装与构造函数
  7. linux 查看数据库和表 mysql 命令
  8. php实现数字英文验证码,PHP英文数字验证码生成类
  9. android修改尾巴软件,安卓手机QQ自定义尾巴编辑教程
  10. JavaScript文档对象模型DOM节点操作之父节点和子节点(2)
  11. matlab 矩阵逻辑与,MATLAB之逻辑
  12. Maven安装与配置教程
  13. python量化交易通达信_分享一个可以实战的量化交易策略(适用于通达信系统)...
  14. Win10镜像安装pytorch-gpu版
  15. HorizontalScrollView 仿真 tabLayout
  16. SSD:单点多边界框探测器
  17. detours钩子库的简单使用
  18. 上天入地影无踪:十大超级老牌黑客
  19. linux进入pe系统,如何进入pe系统【设置模式】
  20. python word 表格宽度_RPA手把手——python-docx 设置 word 文档中表格格式

热门文章

  1. html中图片的属性优化,Html标签元素在SEO中的优化方式(二)
  2. java产生的数字发送到页面_JAVA中数字证书的维护及生成方法
  3. 【ArcGIS Pro微课1000例】0015:ArcGIS Pro中属性字段分式标注案例教程
  4. Android之jni编译出现multiple definition of ‘××××ב
  5. LeetCode之Number Complement
  6. Android之用netcfg命令获取手机虚拟网卡tun0的信息
  7. (十一)python3 只需3小时带你轻松入门——面向对象
  8. html td显示隐藏,显示/隐藏Html TR/TD
  9. 软件配置管理(五)常用重构技巧
  10. 量子力学到底神奇在哪里?看完这个,我的认知彻底坍塌了