王家林亲授《DT大数据梦工厂》大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频、PPT、代码下载:
百度云盘:http://pan.baidu.com/s/1c0noOt6
腾讯微云:http://url.cn/TnGbdC
360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2
土豆:http://www.tudou.com/programs/view/j_kmot9uBb0/
优酷:http://v.youku.com/v_show/id_XMTI5MTgwMDAxNg==.html?from=s1.8-1-1.2
爱奇艺:http://www.iqiyi.com/w_19rru5bi79.html#vfrm=2-3-0-1
腾讯视频:http://v.qq.com/boke/page/b/0/5/b0160il3wj5.html
技术爱好者尤其是大数据爱好者 可以加DT大数据梦工厂的qq群

DT大数据梦工厂① :462923555
DT大数据梦工厂②:437123764
DT大数据梦工厂③ :418110145

微信公众账号: DT_Spark
王家林老师微信号: 18610086859
王家林老师QQ: 1740415547
王家林老师邮箱: 18610086859@126.com

本视频由王家林老师, 亲自讲解, 完全通过代码实战把您带人大数据的时代.

package com.parllay.scala.actor

/**
* Created by richard on 15-8-25.
* 第66讲:Scala并发编程实战初体验
*/
object Hello_Actor {
/**
* Scala语言有很多优点,比如简洁、强大的表现力等等。但我最关注的,是它在并发编程方面的优势。

Scala通过强调对象的不变性 以及使用基于事件的模型进行线程间通信 使得实现并发应用变得简单。

不变对象

并发编程之所以这么困难,很大一个原因在于对象的可变性。
要在充斥着大量可变对象的程序里面实现安全并发,
需要非常繁琐以及复杂易错的同步操作来保证状态更新的同步。

比如下面这段代码(java的例子),可能你会认为它已经是线程安全的了,
因为所有的方法都已经被同步。

Java代码 收藏代码
class Account {
private int balance;

synchronized public int getBalance() {
return balance;
}

synchronized public void incrementBalance() {
balance++;
}
}

但是问题来了,当顺序调用这两个方法的时候,比如:

Java代码 收藏代码
account.incrementBalance();
account.getBalance();

这时并不是线程安全的,在第一个方法调用结束之后,
可能会被其它线程获取对象的锁,修改account的balance。

在命令式编程语言里面,命令查询分离是一个普遍使用的原则。意即:
一个方法要么进行一次命令(执行一个操作,通常会修改状态),
要么进行一次查询(返回一些状态, 但并不修改状态),而不应该同时执行命令以及查询。
从面向对象的角度看,这是一个良好的设计;但从并发编程的角度看,
它却带来了一些问题,使得并发编程实现更加困难。上面就是一个很好的例子。

要使得上面这段代码变得线程安全,可以通过破坏命令查询分离原则来实现:

Java代码 收藏代码
synchronized public int incrementAndGetBalance() {
balance++;
return balance;
}

从上面的例子看到,在可变对象的环境中实现并发编程是困难的。而不变对象,
意即线程安全的对象,使得我们不必担心共享对象会被多个线程同时修改而无法保持它的正确性:
因为它本身就不可修改。我们可以把不变对象很放心地扔到多线程环境中,任意使用。

问题又来了,如果要“修改状态”怎么办?很简单,创建一个新的对象。还是上面那个例子,
我们把它修改成一个Scala的不变对象类。并在伴生对象里面实现increment方法,
此方法会返回一个新的account对象,balance值为原有对象的值加1所得。

Java代码 收藏代码
class Account (val balance: Integer) {
def getBalance() = balance
}

object Account {
def increment(account: Account): Account {
new Account(account.getBalance() + 1)
}
}

通过强调不变对象的使用,并发编程变得简单了很多。

Actor

传统的并发是通过线程(thread)来实现的。在传统的并发模型中,程序被分成若干份同时执行的任务,
并且所有任务都对一块共享的内存进行操作。在传统的并发模型会引起竞争问题,
可以采取锁机制避免竞争问题,但同时这可能带来死锁等问题。

Actor模型是另一种不同的并发模型,它很好地解决了在传统并发模型中竞争和死锁等问题。
我们可以把一个由actor模型实现的并发程序看成是一个星系一样,星系里面有很多星球,
每个星球都是一个actor,星球之间不共享任何资源,但是它们之间有通道来相互传递信息。

每个星球(actor)都有一个信箱来接受来自其它星球的任意信息,它会按照信息接收的顺序来处理,
处理完一个信息然后接着处理下一个信息。可以按照信息类型来触发不同的行为。

同时,每个星球(actor)可以异步地(也可以同步,但不是这里谈论的重点)向其它任意星球发送任意消息,
就是说,它发送消息之后不会等待返回信息而是直接执行接下来的操作。

下面是一个Actor的例子:

Java代码 收藏代码
import scala.actors.Actor
import scala.actors.Actor._

case class Increment(amount: Int)
case class Balance

class Account extends Actor {
var balance: Int = 0;

def act() = {
while (true) {
receive {
case Increment(amount) =>
balance += amount
case Balance =>
println("Balance is " + balance)
exit()
}
}
}
}

我们可以看到,程序里面定义两种不同的消息类型:Increment和Balance。Account是一个Actor,
它跟外界的交互都是通过消息传递来实现:不论是increment,还是获取balance都是通过消息的方式来实现。
当接受到不同的消息时,它会执行不同的行为。

我们也可以看到,Account的内部状态完全是自己控制的,接收到的消息是顺序执行的,
所以我们不需要担心竞争问题。
小结

Scala就是这样,通过“使用基于事件的模型进行线程间通信”,并且“把不变对象作为消息进行传递”来实现一个并发编程模型。
*/
}

Scala 深入浅出实战经典 第66讲:Scala并发编程实战初体验的更多相关文章

  1. Scala 深入浅出实战经典 第81讲:Scala中List的构造是的类型约束逆变、协变、下界详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-97讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  2. Scala 深入浅出实战经典 第79讲:单例深入讲解及单例背后的链式表达式

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  3. Scala 深入浅出实战经典 第78讲:Type与Class实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  4. Scala 深入浅出实战经典 第77讲:模式匹配下的提取器动手构造实战

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  5. Scala 深入浅出实战经典 第76讲:模式匹配下的赋值语句

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  6. Scala 深入浅出实战经典 第75讲:模式匹配下的For循环

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  7. Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  8. Scala 深入浅出实战经典 第67讲:Scala并发编程匿名Actor、消息传递、偏函数解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  9. Scala 深入浅出实战经典 第65讲:Scala中隐式转换内幕揭秘、最佳实践及其在Spark中的应用源码解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

随机推荐

  1. C# Delegate 匿名 Delegate

    C#6.0新添加了 lambda的强力支持,用lambda的确可以节省好多代码,让代码看起来更简洁,更直观: 这里做一个笔记,C#的匿名委托 Demo class Program { static v ...

  2. Text input(文本输入框)

    Text input(文本输入框)是用来获得用户输入的绝佳方式. 你可以用如下方法创建: <input type="text"> 注意,input元素是自关闭的.

  3. Wordnet的一些简单使用

    转载请说明出处:http://www.cnblogs.com/KingKou/p/4121373.html 1.简介 Wordnet是一个由普林斯顿大学认识科学实验室在心理学教授乔治·A·米勒的指导下 ...

  4. C#设计模式(14)——模板方法模式(Template Method)

    一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...

  5. NuGet v3 feed带来的惊喜

    估计有1个月了,在mac上编译dnx从来没有成功过,因为在安装nuget packages时连接myget.org总是超时. 今天在 ASP.NET 5 Beta5 Now Available 中得知 ...

  6. 在mac中自动保存git用户名与密码如此简单

    之前为了实现在Windows中自动保存git用户名与密码,写过一篇博客终于解决“Git Windows客户端保存用户名与密码”的问题,需要进行一堆配置. 而在Mac OS X中这个操作竟然如此简单.只 ...

  7. 初识ASP.NET 5中的Sake与KoreBuild

    从github上签出基于ASP.NET 5的MVC 6的源代码进行编译,发现有2个编译命令: build.cmd是针对Windows的编译命令,build.sh是针对Mac/Linux的编译命令,这本 ...

  8. maven 打包 xml文件

    说起来手贱啊,搞了两个小时,就是因为打包的时候,maven无法把xml文件打包到正确的位置. 本来应该是打包到 com/presistence包下,结果打出来有两个包,一个是com/presisten ...

  9. 第十四章:样式(Style)和主题(Theme)

    简介 Android的样式(Style)和主题(Theme)文件就好比WEB开发中的CSS一样,可以实现UI界面的风格统一管理,这和Windows平台的XAML格式(Silverlight.WPF)类 ...

  10. unity3D——自带寻路Navmesh入门教程(二)(转)

    转自:http://liweizhaolili.blog.163.com/blog/static/16230744201271210237616/ 上一节简单介绍了NavMesh寻路的基本用法,这次来 ...