开发者学堂课程【Scala 核心编程 - 进阶:线程安全集合和并行计算介绍】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9063
线程安全集合和并行计算介绍
基本介绍
所有线程安全的集合都是以 Synchronized 开头的集合
SynchronizedBuffer
SynchronizedMap
SynchronizedPrionity
SynchronizedQueue
SynchronizedSet
SynchronizedStack
理论上来说我们不变的集合依然就实现了线上安全,但是有一个问题?
我们的可变集合他在默认情况下线程安全控制的并不是很好,愿意可变的,基于这个原因我们这个 Synchronized 设计者他也指出可变集合的线上安全,像 Buffer 他提供了 SynchronizedBuffer,也就说线程安全的这种集合会有 Synchronized 打头可以在这个地方进行选用。
并行集合
基本介绍
1.Scaia 为了充分使用多核 CPU,提供了并行集合(有别于前面的串行集合),用于多核环境的并行计算。
传统的语言并没有真正发现我们 CPU 多核的效率,比如说打开任务管理器里面有个资源监视器。
这个电脑上有2个 CPU 4个核,这个配置就是很低很低的了,像做大数据一般来讲最少16个核,现在有一个问题,我们怎么充分利用 CPU 呢?
现在很多新的语言都加入对多核 CPU 的调动,那么我们看在这个 Synchronized 里面是直接支持多核 CPU 的调动 。
2.主要用到的算法有:
Divide and conquer:分治算法,Scala 通过 splitters(分解器),combiners(组合器) 等抽象层来实现,主要原理是将计算工作分解很多任务,分发给一些处理器来完成,并将它们处理结果合并返回。
这样我们就真正做到了并发,以前传统的并发只是看起来像并发,其实并不是真正并发,它只是 CPU 调动时间很短,单核你也可以一边上网一边看电影只是 CPU 在不停的调动而已,如果用了这个分治算法,他就可以真正达到多个 CPU 同时计算。
这个调度算法跟这个分治算法它们是相辅相成的,分治算法它可以把任务分解到不同的处理器去,那么问题来了,假如有一个处理器已经很累了,你再把任务交给它一定是不合理的Work stealin 算法,主要用于任务调度负载均衡(load-balancing),通俗点完成自己的所有任务之后,发现其他人还有活没干完,主动(或被安排)帮他人一起干,这样达到尽早干完的目的.他达到这样一个负载均衡的效果。
在学大数据的时,应该会讲到一些调度或者负载均衡的算法,有些公司他会自己开发一些适合他的业务逻辑的调动算法,我们说大数据有2种职位,一种应用工程师,写别人写好的算法,就是别人写好的算法你拿来用,第二种就是自己设计算法,这种就比较高级一点。
应用案例
Paraliel 并行
打印1~5
(1 to 5).foreach(_))
Println()
(1 to 5).par.foreach(println(_))
这个并行计算特别简单,只需要写一个 par 就行了。