并发编程的本质问题是:
- 在多线程环境下,一个线程对共享变量的修改,什么时候能够被其他线程看到?
- 编译器和 CPU 是否允许对指令进行重排序?
- 哪些操作具备原子性保证?
这些问题由内存模型(Memory Model)来定义。
并发编程的本质问题是:
这些问题由内存模型(Memory Model)来定义。
异步编程是现代软件中必不可少的一部分,特别是在后端服务、高并发与 UI 程序中。C# 提供了语言级的 async/await 支持,而 Android/Kotlin 使用协程(Coroutines)来实现异步逻辑。两者都能让你以接近同步的方式编写异步代码,但它们的设计理念、运行机制和应用场景有明显差异。
builder模式是一种非常简单且容易理解的设计模式。在我们使用各种三方类库时经常会用到。本篇文章不会具体介绍builder模式。只是随着工作时间增加,感觉到平常我们使用设计模式并不是一蹴而就的,大部分都是随着业务累加或改变,才会依据不同设计模式对代码进行不同程度的调整。最近也是面试了一阵,想着正好可以举一个简单演变的例子,对日常工作中使用的设计模式做一个总结。这次以一个最简单的builder模式为例,看看我之前工作中代码结构是如何演变的。
前面Rx系列的五篇文章从源码的角度分析了RxJava几个主要功能的具体实现逻辑。在学习了RxJava源码之后的一段时间里,我阅读了Rx相关更多的文章,以及通过面试、技术分享等经历,一直在思考一个问题,就是如何总结RxJava的思想,其实就是如何讲清楚RxJava。尤其对于面试这种情况来说,很难在短时间内细抠源码,如何让面试官知道你学习过源码而不是只有使用的经验。以及在分享的时候如何能让听者快速理解。这篇文章就是我近期对这类问题的一个思考总结,基于波浪事件流和模块化的思路来分析RxJava。
最近在刷Leetcode,目前在“Explore”中出了很多学习和面试的专题,刷了几个系列感觉非常不错。“斐波那契数列”是一个很经典的问题了,无论是讲解递归还是动态规划的文章中都时常能看到。可以用斐波那契数列求解的题目也有很多,比如“爬梯子”和“兔子繁殖”等经典问题。在此主要是记录一下解决“斐波那契数列”类似问题的6种思路。
经过前面四篇文章,我们已经了解了RxJava相关的一些基础。接下来,我们将进入RxJava最核心的内容—-线程调度。从Rx官网介绍来看,ReactiveX系列实现的核心功能就是异步编程,而程序层面中实现异步的核心是多线程。本篇文章内容稍长,如果稍有困惑可直接跳到文章末尾看流程图,可能会方便理解。
上一篇我们介绍了RxJava最基本的实现方式以及源码逻辑,但是仅仅会基础实现方式是远远不够的。RxJava有着大量的各式各样的操作符(如上图谱所示)。也正是因为这些操作符,使得RxJava可以很简单且简洁的实现一些复杂的问题。这也是RxJava以至于Rx系列强大的原因之一。