Java并发编程实战
王宝令
资深架构师
立即订阅
15049 人已学习
课程目录
已完结 50 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你为什么需要学习并发编程?
免费
学习攻略 (1讲)
学习攻略 | 如何才能学好并发编程?
第一部分:并发理论基础 (13讲)
01 | 可见性、原子性和有序性问题:并发编程Bug的源头
02 | Java内存模型:看Java如何解决可见性和有序性问题
03 | 互斥锁(上):解决原子性问题
04 | 互斥锁(下):如何用一把锁保护多个资源?
05 | 一不小心就死锁了,怎么办?
06 | 用“等待-通知”机制优化循环等待
07 | 安全性、活跃性以及性能问题
08 | 管程:并发编程的万能钥匙
09 | Java线程(上):Java线程的生命周期
10 | Java线程(中):创建多少线程才是合适的?
11 | Java线程(下):为什么局部变量是线程安全的?
12 | 如何用面向对象思想写好并发程序?
13 | 理论基础模块热点问题答疑
第二部分:并发工具类 (14讲)
14 | Lock和Condition(上):隐藏在并发包中的管程
15 | Lock和Condition(下):Dubbo如何用管程实现异步转同步?
16 | Semaphore:如何快速实现一个限流器?
17 | ReadWriteLock:如何快速实现一个完备的缓存?
18 | StampedLock:有没有比读写锁更快的锁?
19 | CountDownLatch和CyclicBarrier:如何让多线程步调一致?
20 | 并发容器:都有哪些“坑”需要我们填?
21 | 原子类:无锁工具类的典范
22 | Executor与线程池:如何创建正确的线程池?
23 | Future:如何用多线程实现最优的“烧水泡茶”程序?
24 | CompletableFuture:异步编程没那么难
25 | CompletionService:如何批量执行异步任务?
26 | Fork/Join:单机版的MapReduce
27 | 并发工具类模块热点问题答疑
第三部分:并发设计模式 (10讲)
28 | Immutability模式:如何利用不变性解决并发问题?
29 | Copy-on-Write模式:不是延时策略的COW
30 | 线程本地存储模式:没有共享,就没有伤害
31 | Guarded Suspension模式:等待唤醒机制的规范实现
32 | Balking模式:再谈线程安全的单例模式
33 | Thread-Per-Message模式:最简单实用的分工方法
34 | Worker Thread模式:如何避免重复创建线程?
35 | 两阶段终止模式:如何优雅地终止线程?
36 | 生产者-消费者模式:用流水线思想提高效率
37 | 设计模式模块热点问题答疑
第四部分:案例分析 (4讲)
38 | 案例分析(一):高性能限流器Guava RateLimiter
39 | 案例分析(二):高性能网络应用框架Netty
40 | 案例分析(三):高性能队列Disruptor
41 | 案例分析(四):高性能数据库连接池HiKariCP
第五部分:其他并发模型 (4讲)
42 | Actor模型:面向对象原生的并发模型
43 | 软件事务内存:借鉴数据库的并发经验
44 | 协程:更轻量级的线程
45 | CSP模型:Golang的主力队员
结束语 (1讲)
结束语 | 十年之后,初心依旧
用户故事 (2讲)
用户来信 | 真好,面试考到这些并发编程,我都答对了!
3 个用户来信 | 打开一个新的并发世界
Java并发编程实战
登录|注册

42 | Actor模型:面向对象原生的并发模型

王宝令 2019-06-04
上学的时候,有门计算机专业课叫做面向对象编程,学这门课的时候有个问题困扰了我很久,按照面向对象编程的理论,对象之间通信需要依靠消息,而实际上,像 C++、Java 这些面向对象的语言,对象之间通信,依靠的是对象方法。对象方法和过程语言里的函数本质上没有区别,有入参、有出参,思维方式很相似,使用起来都很简单。那面向对象理论里的消息是否就等价于面向对象语言里的对象方法呢?很长一段时间里,我都以为对象方法是面向对象理论中消息的一种实现,直到接触到 Actor 模型,才明白消息压根不是这个实现法。

Hello Actor 模型

Actor 模型本质上是一种计算模型,基本的计算单元称为 Actor,换言之,在 Actor 模型中,所有的计算都是在 Actor 中执行的。在面向对象编程里面,一切都是对象;在 Actor 模型里,一切都是 Actor,并且 Actor 之间是完全隔离的,不会共享任何变量。
当看到“不共享任何变量”的时候,相信你一定会眼前一亮,并发问题的根源就在于共享变量,而 Actor 模型中 Actor 之间不共享变量,那用 Actor 模型解决并发问题,一定是相当顺手。的确是这样,所以很多人就把 Actor 模型定义为一种并发计算模型。其实 Actor 模型早在 1973 年就被提出来了,只是直到最近几年才被广泛关注,一个主要原因就在于它是解决并发问题的利器,而最近几年随着多核处理器的发展,并发问题被推到了风口浪尖上。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java并发编程实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(21)

  • 请问actor模型与reactor模型有什么关联和区别吗?

    作者回复: 雷锋和雷峰塔的关系

    2019-08-06
    30
  • 兔斯基
    这种并发模型现实应用多么?系统往往很少有可以接受丢失消息的吧?

    作者回复: 线程池也一样会丢数据,现在基本上都是靠数据库,mq这些支持事务的存储来搞定安全的异步处理

    2019-06-04
    1
    5
  • QQ怪
    老师,actor模式具体实现的产品有哪些?想知道这些更加理解actor

    作者回复: spark,flink,play应该都用到了,我也不会scala,如果想深入理解只能先把scala学了😂😂

    2019-06-04
    3
  • 翡冷翠
    累加器这个例子里只是启动了四个线程去发送消息,实际累加只是在一个线程(actor)里进行的
    2019-07-01
    2
  • 晓杰
    请问老师actor模型的效率是不是会比较低

    作者回复: 不会

    2019-06-05
    1
    2
  • aoe
    感兴趣的可以看看《响应式架构 消息模式Actor实现与Scala.Akka应用集成》

    作者回复: 这本书也不错

    2019-11-22
    1
  • 这里的Actor工作方式很像游戏里的角色Actor,ActorSystem就是游戏里的World
    2019-10-29
    1
    1
  • cricket1981
    "也不保证消息送达的顺序和发送的顺序是一致的" …… 想问下什么情况下会发生这种情形?MailBox不是类似Queue一样FIFO结构吗?

    作者回复: 理论模型没这要求,并发情况下严格实现fifo很影响性能

    2019-06-05
    1
  • Liam
    actor,看erlang
    2019-06-05
    1
  • 潭州太守
    请问老师,Actor是不是不适合低延迟场景,或者有没有策略保证低延迟。

    作者回复: 也不是,erlang就有这方面的应用

    2019-06-04
    1
  • 有铭
    Actor模型的最佳实践目前还是erlang,Java的akka有些不伦不类
    2019-06-04
    1
  • 周治慧
    万物皆是面向对象 早上好
    2019-06-04
    1
  • DFighting
    Actor读起来好像流数据处理模型中的Operator,不过Flink解决一致性语义(exactly-once)使用的是轻量级一致性快照,即在每个节点内部缓存当前整个系统执行到何处的状态,不过代价就是需要在计算拓扑中传递状态,算是一种内存换一致性吧,不过现在存储愈发可得,这个代价应该也是可以接受的。

    作者回复: 👍

    2019-10-16
  • 张三丰
    很长一段时间里,我都以为对象方法是面向对象理论中消息的一种实现,直到接触到 Actor 模型,才明白消息压根不是这个实现法。


    老师是认为面向对象调用方法不叫消息?那么面向对象调用方法这种数据传递方式叫什么?

    作者回复: 方法参数😂

    2019-10-14
  • helloworld
    老师说Actor模型并不能保证消息100%可达,也不能保证100%能被处理,可见Actor模式适用的情形还是受限狭窄的
    2019-09-23
    1
  • 机遇号
    老师您好,能不能在继承UntypedActor这个类里将消息保存到数据库?具体怎么实现?能不能指点一下
    2019-06-11
    1
  • 感觉核心就是通过消息对列实现消息的暂存,然后actor就可以一个接一个单线程处理消息。有点像redis,但不同的是不同actor的调用线程可能不一样,只要保证同一时刻最多只有一个线程处理某个actor就行,并且actor直接可以消息通信,意味着可以用多个actor去组织起来完成一次请求。
    2019-06-04
  • 明天更美好
    遇到一个线程问题,我们有个业务要通过mq去通知第三方,但是第三方能力比较差,我们同步的时候mq堆积很多。后来改成用woker-thread模式,队列设置了2000线程用了64个机器是64核的,拒绝策论是当前线程执行该任务。结果发现队列很快就被放满了,一段时间后mq又堆积了。因为客户端没有及时签收消息,导致broker限流了直接不销费了,这种问题老师您有什么好的建议吗?
    2019-06-04
    1
  • 往事随风,顺其自然
    Scala 编写spark 内部实现也是用这个通信机制
    2019-06-04
  • 要是有数据库io和纯cpu结合的大数据量高并发的实际就更好😊
    2019-06-04
收起评论
21
返回
顶部