
并发编程
蜡笔小勋
广东工业大学计算机学院软件工程专业
展开
-
并发编程的挑战
1、如何减少上下文的切换 (1)无所并发编程。多线程竞争时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的id按照hash算法取模分段,不同的线程处理不同段的数据。 (2)CAS算法。compare and set 算法。java的atomic包使用cas算法来更新数据,而不需要加锁。 (3)使用最少的线程。避免创建不需要的线程 (4)协程。在单线程里实现多原创 2017-01-21 23:32:12 · 503 阅读 · 0 评论 -
内存屏障
原文地址 作者:Martin Thompson 译者:一粟 校对:无叶,方腾飞 本文我将和大家讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见的一项技术。 CPU使用了很多优化技术来实现一个目标:CPU执行单元的速度要远超主存访问速度。在上一篇文章 “Write Combing (合并写)”中我已经介绍了其中的一项技术转载 2017-03-21 14:07:50 · 565 阅读 · 0 评论 -
happens-before规则和as-if-serial语义
JSR-133使用happens-before的概念来阐述操作之间的内存可见性。在JMM中,如果一个操作执行的结果需要对另一个操作可见, 那么这2个操作之间必须要存在happens-before关系。这里提到的2个操作既可以是一个线程之内,也可以是不同线程之间。 与程序员密切相关的happens-before规则如下: 1、程序顺序规则:一个线程中的每个操作,happens-before于线原创 2017-03-22 11:19:18 · 8596 阅读 · 1 评论 -
Java指令重排序
在执行程序时候,为了提高性能,编译器和处理器常常会对指令做重排序。重排序分3中类型。 1、编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。 2、指令级并行的重排序。现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据的依赖性,处理器可以改变语句对应机器指令的执行顺序。 3、内存系统的重排序。由于处理器使用缓存和读/写缓冲区,这使得加载和存储转载 2017-03-15 11:25:36 · 593 阅读 · 0 评论 -
concurrent包的实现
由于java的CAS同时具有 volatile 读和volatile写的内存语义,因此Java线程之间的通信现在有了下面四种方式: A线程写volatile变量,随后B线程读这个volatile变量。A线程写volatile变量,随后B线程用CAS更新这个volatile变量。A线程用CAS更新一个volatile变量,随后B线程用CAS更新这个volatile变量。A线程用CAS转载 2017-09-17 23:58:03 · 574 阅读 · 0 评论 -
CAS操作ABA问题发生的场景
最开始看一些资料,提到了CAS操作存在问题,就是在CAS之前A变成B又变回A,CAS还是能够设置成功的,开始十分的费解,怎么可能呢,A变回了A就应该能够CAS成功啊,为什么会不成功呢? 于是去查了一些资料,其中提到了两种情况: 第一种,A最开始的内存地址是X,然后失效了,有分配了B,恰好内存地址是X,这时候通过CAS操作,却设置成功了。这种情况在带有GC的语言中,这种情况是不可能发生转载 2017-09-18 00:28:18 · 966 阅读 · 0 评论