参考大哥http://www.sohu.com/a/248902628_100063030

在多线程环境下,i++并不安全。使用两个线程同时操作i++ 1w万次,可能得出i的值并不是2w。想要安全的使用i++, 在java上可以使用synchronized关键字, c/c++语言中可以使用pthread_mutex_lock。c的sleep函数也同样让我着迷,它可以让线程“暂停”,想不通它是怎么做到的。但感觉它们应该有共性的,抢占一个被占用的锁时是要出现“等待”的。

1. 原子操作i++以前维护过一个c/c++项目,它实现了一套的引用计数来管理对象。跟踪它在增加引用计数时调用了android_atomic_inc,android_atomic_inc又调用了android_atomic_add,android_atomic_add函数是内嵌汇编实现的:

(注:文中代码均可左右滑动)xtern ANDROID_ATOMIC_INLINE

int32_t android_atomic_add(int32_t increment, volatile int32_t *ptr)

{

int32_t prev, tmp, status;

android_memory_barrier();

do {

__asm__ __volatile__ ("ldrex %0, [%4]\n"

"add %1, %0, %5\n"

"strex %2, %1, [%4]"

: "=&r" (prev), "=&r" (tmp),

"=&r" (status), "+m" (*ptr)

: "r" (ptr), "Ir" (increment)

: "cc");

} while (__builtin_expect(status != 0, 0));

return prev;

}

第一眼看上去,肯定会怀疑代码是不是找错了,怎么会有一个循环呢?我们慢慢分析一下,依据c/c++调用汇编参数传递格式,可以列出下表:

do {依据这个表可以把上面汇编代码转换成伪代码:

tmp = *ptr;

tmp = tmp + increment;

*ptr = tmp;

} while (status != 0);

这很好理解,关键是怎样达到原子操作(线程安全)呢,就是ldrex和strex指令的功能了,两条指令的官方文档:

主要看Operation栏。指令ldrex在取值时会在对应内存上做一个exclusive access标记;指令strex存值时有这个标记就会存值成功,返回0,没有这个标记就会存值失败,返回1。这个标记就是独占式访问标记,是针对cpu的,多核环境下也没有问题。

原子操作、锁、同步实现原理相关推荐

  1. synchronized实现同步的原理和锁状态

    参考自美团技术团队. 一.synchronized实现同步的原理 我们需要了解两个重要的概念:"Java对象头"."Monitor". 1.对象头 synchr ...

  2. Redis如何实现分布式锁延时队列以及限流应用丨Redis源码原理|跳表|B+树|分布式锁|中间件|主从同步|存储原理

    Redis如何实现分布式锁延时队列以及限流应用 视频讲解如下,点击观看: Redis如何实现分布式锁延时队列以及限流应用丨Redis源码原理|跳表|B+树|分布式锁|中间件|主从同步|存储原理|数据模 ...

  3. handler原子锁_Linux的原子操作与同步机制

    Linux的原子操作与同步机制 并发问题 现代操作系统支持多任务的并发,并发在提高计算资源利用率的同时也带来了资源竞争的问题.例如C语言语句"count++;"在未经编译器优化时生 ...

  4. python互斥锁原理_Linux 互斥锁的实现原理(pthread_mutex_t)

    引言 互斥锁大都会使用,但是要了解其原理就要花费一番功夫了.尽管我们说互斥锁是用来保护一个临界区,实际上保护的是临界区中被操纵的数据. 互斥锁还是分为三类:快速互斥锁/递归互斥锁/检测互斥锁 fute ...

  5. 理解:iOS开发中锁的实现原理

    摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知识点(三):Lock.本文也不 ...

  6. windows系统多线程同步机制原理总结

    windows系统多线程同步机制原理总结 同步问题是开发过程中遇到的重要问题之一.同步是要保证在并发执行的环境中各个控制流可以有序地执行,包括对于资源的共享或互斥访问,以及代码功能的逻辑顺序. 为了保 ...

  7. Java乐观锁的实现原理和典型案例

    Java乐观锁的实现原理 什么是乐观锁? 在并发编程中,多个线程同时对同一资源进行操作时,需要使用锁来保证数据的一致性. 乐观锁与悲观锁是两种不同的锁机制. 悲观锁会在整个操作期间占用资源的独占性,以 ...

  8. 快来学习Redis 分布式锁的背后原理

    以前在学校做小项目的时候,用到Redis,基本也只是用来当作缓存.可阿粉在工作中发现,Redis在生产中并不只是当作缓存这么简单.在阿粉接触到的项目中,Redis起到了一个分布式锁的作用,具体情况是这 ...

  9. Alibaba Dubbo框架同步调用原理分析-1

    2019独角兽企业重金招聘Python工程师标准>>> 由于Dubbo底层采用Socket进行通信,自己对通信理理论也不是很清楚,所以顺便把通信的知识也学习一下. n  通信理论 计 ...

  10. 还不知道 Redis 分布式锁的背后原理?还不赶快学习一下

    前言 以前在学校做小项目的时候,用到Redis,基本也只是用来当作缓存.可阿粉在工作中发现,Redis在生产中并不只是当作缓存这么简单.在阿粉接触到的项目中,Redis起到了一个分布式锁的作用,具体情 ...

最新文章

  1. mysql帐号,权限管理
  2. 在Linux中如何禁止用户登录
  3. 基于Spark的大规模推荐系统特征工程
  4. (0073)iOS开发之核心动画高级技巧
  5. 一致吗 驱动_外国不过春节?AMD驱动再更新,解决BUG,游戏不闪退,重启不黑屏...
  6. 为什么要用动态代理?静态代理与动态代理详解
  7. Python能做什么事?为什么人工智能一定要学Python?
  8. 下拉框的value值怎么设置为变量_自绘制HT For Web ComboBox下拉框组件
  9. C++ 学习基础篇(一)—— C++与C 的区别
  10. 草稿 9203 作业重点关注
  11. python文件命名 数字,当文件存在时,文件名中的数字递增
  12. 智慧城市、智慧园区、智慧交通、行业经营看板、运行管理大屏、图表模板、公司经营看板、大屏可视化、BI可视化模板、智慧工厂、办公、能源、餐饮、校园、人力资源、行政、汽车、房地产、保险、医院、axure原型
  13. Swarm搭建Docker集群
  14. PPT怎么切换不同的母版
  15. springboot微信授权登录
  16. 数学建模课程设计-住房的合理定价问题
  17. 连接查询之内连接(等值连接、非等值连接和自连接)
  18. Clipper库 | 类型和填充规则
  19. 使用arch-anywhere来安装arch
  20. 敬业福终极攻略:马云的福字和这些图可多扫十几张福卡

热门文章

  1. 检查评分汇总表缺项计算机,综合检查评分表.docx
  2. 系统盘无损迁移至固态硬盘(机械硬盘)
  3. html怎么改变网页整体的大小,html设置浏览器大小
  4. RGMII_PHY测试笔记1 基于开发板MiS603-X25
  5. 增量式编码器与绝对值编码器的区别
  6. 跨年巨作 13万字 腾讯高工手写JDK源码笔记 带你飙向实战
  7. consol32.exe
  8. 作为应届生到底是去大的IT公司好,还是去小的IT公司好?
  9. managed-schema配置文件详解
  10. 巴比特 | 元宇宙每日必读:微博动漫将招募全球各类虚拟偶像并为其提供扶持...