参考大哥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. 云计算已成创新基础设施,三大暗流左右未来“云市场”
  2. Docker容器相关命令
  3. QT的QScroller类的使用
  4. 字体--Ubuntu手记之系统配置
  5. Android官方开发文档Training系列课程中文版:手势处理之监测通用手势
  6. 简述oracle数据库特殊状态,【OracleDB】 01 概述和基本操作
  7. 携程Apollo分布式配置中心搭建指南
  8. 一些html5和css3的一些常见面试题
  9. Idea集成springboot报错(cound not autowire)
  10. java泊松分布_Java中利用Math.random()产生服从泊松分布的随机数
  11. 被投毒的管道:研究员探索CI环境中的攻击方法
  12. mac remix导入本地项目
  13. Java疯狂讲义读书笔记第五章
  14. 2018计算机应用基础教材,2018年计算机应用基础课件全套PPT电子档.ppt
  15. uni-app知识点整理(1)- uni-app简介、环境搭建、项目创建、项目目录文件
  16. CSP开发基础--CSP入门简介
  17. 南朝皇帝简介-20170604
  18. matlab竖向正负柱状图,echarts竖向正负柱状图【如何用EXCEL做正负柱状图?请高手指点,谢谢】...
  19. 【自然语言处理】【ChatGPT系列】大模型的涌现能力
  20. 2018航电多校练习第9场-快速幂

热门文章

  1. 阿里云安全组已经开放端口但是服务器端口还是不能访问
  2. CSS单位中px、en和rer的区别?
  3. linux springboot开机启动,SpringBoot 部署到Linux开机自启动和运行
  4. Linux单机到Windows的OGG安装部署步骤
  5. java.util.concurrent.TimeoutException: Waited 3000 milliseconds (plus 2 milliseconds, 351400 nanosec
  6. 黑马程序员---java算法实现输出任意奇数维数独
  7. 5-RNN-01_字符集RNN
  8. 8000 sentences of Oral English(one)
  9. 守护绿水青山,环保数采仪一马当先!
  10. python找不到指定模块sklearn怎么办_python中sklearn找不到指定模块怎么办