非阻塞算法-简单的计数器
2015-11-03 14:17
197 查看
http://www.cnblogs.com/developerY/p/4932202.html
1.为什么要用非阻塞算法?我们知道为了避免并发环境下操作共享变量的问题,可以采用同步(synchronize)和锁(Lock)的方式做到线程安全,但是JVM处理锁竞争时对于竞争失败的线程采用的是挂起稍后调度的策略,这样会带来额外的线程上下文切换成本。同时和CAS(Compare And Set)这种非阻塞算法相比,CAS是在底层硬件(CPU)层面实现,只需要锁定独立的内存位置,更细的同步粒度使得CAS失败的线程可以立即重试而不用挂起。总的来说,大多数场景下非阻塞算法和同步锁相比能带来更好的性能,最小化串行代码的粒度是并行性能的关键。
2.非阻塞算法的弊端
CAS算法是先compare再set,如果compare结果为false的话就不会执行set直接返回false,也就是说非阻塞算法可能会失败,因此非阻塞算法往往需要放在循环里不断重试直到成功,所以在锁竞争非常严重时非阻塞算法的性能可能会严重下降,甚至不如阻塞算法。
3.最简单的CAS用法
CAS的全称是Compare and Set,是现代主流CPU都支持的一个CPU原子语义操作,简单来说就是先跟某个值对比,如果等于这个值就设置成新的值,如果不等于这个值就放弃操作同时返回失败。这里我们看一下最常用的计数器,首先我们看一个单线程的计数器:
接下来我们看同步的计数器
最后我们看无锁算法的计数器
4.总结
CAS算法和同步锁相比,把串行的粒度从方法级别降低到CPU的CAS原子操作,提高了并发度,因此提高了系统的容量,但是CAS在失败时是需要重试的,因此如果并发度很高,竞争十分严重的情况下,因为需要大量重试操作,CAS的效率可能甚至不如同步方法。
下一节我们继续讲如何把CAS算法用在一些更复杂一些的数据结构上。
相关文章推荐
- Android Facebook登录的简单实现
- 字符串加密,解密
- python3.4批量重命名程序封装
- 关于Tomcat 中进入欢迎页面和Server Status的解决办法
- HttpServlet cannot be resolved to a type?
- 高通bootloader
- Hadoop之文件副本是如何存储的
- eclipse添加tomcat启动正常,localhost:8080访问提示404
- 使用butterknife注意事项
- 反思自己
- 关于“类型xxxxx不明确: 它可能来自程序集”
- 使用 chrome的命令行标记:disable-web-security 参数联调线上数据----------Chrome 浏览器跨域和安全访问问题
- PopupWindow实现android自定义弹出框口
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
- classpath
- log4cplus 使用方法 配置
- (原创)c#学习笔记08--面向对象编程简介03--Windows应用程序中的OOP
- cocos2d-x Github 下载地址
- Hadoop之运行原理
- 使用系统类NSURLSessionDownloadTask实现断点续传(音乐视频下载等)