LieBrother

当才华撑不起野心时,应该静下心来学习;当能力驾驭不了目标时,应该沉下心来历练。


  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

老板叫你别阻塞了

发表于 2019-08-07   |     |   阅读次数

Java 多线程系列文章第 4 篇。

继续咱们的 Java 多线程系列文章,今天再讲讲概念,这篇应该是最后一篇基础概念,接下来就直接进入 Java 多线程主题了,在后面的文章里如果有概念需要单独拿出来讲时再补充概念篇。

这篇文章主要讲讲阻塞(Blocking)和非阻塞(Non-blocking)。

上班后必学第一技能

以前在学校做项目,基本上都是独立开发,每个人开发一个部分,以最小化沟通成本的方式划分工作量。到了职场,单纯的以最小化对接成本来安排工作是几乎不可能的,要考虑的因素变多了,各种跨小组、跨部门、甚至跨职场的工作,这就带来了沟通成本以及工作对接的各种阻塞问题。

新人刚入职场的时候,对一切都不熟悉,在做一些小组以外的对接工作时,就会遇到种种问题,特别现在充斥着各种分布式架构,以前开发 Web 后台的同学要会开发 JSP 页面,而现在前后端都分离了。设想一下这个场景。

小明是学习前端出身,刚开始步入职场,做的第一个需求就是登录和注册界面,需要对接一个写后台的同事小东,小东负责开发登录和注册的后台逻辑。小明开发了登录界面,准备和小东对接联调登录功能,这时小东回复说他刚好有生产 bug 在跟进,还没开发好,这时小明该怎么做?

有 2 种做法:

  1. 干等着小东开发好登录后台,再和他联调。

  2. 开发注册界面,开发过程中再时刻询问小东登录后台接口是否做完了,如果小东做完了,再去对接。

这 2 种做法的关键区别是什么呢?对于小东来说,没啥区别,他能做的就是尽量早点实现他的功能点。主要关注小明,第一种做法,小明做好了登录界面,接着则等待小东的登录后台接口,如果小东要开发一下午,那么小明就一下午啥事也不干,这种情况就是阻塞,小明的其他任务因为登录界面没对接联调,而一直阻塞着;第二种做法,小明得知小东登录后台接口还没实现,就着手先做注册界面的功能,然后每过一个小时跟小东确认一下登录后台接口开发是否开发完成,直到小东开发完登录后台接口,便开始对接联调,这种情况就是非阻塞,登录界面没对接联调完全不影响小明的开发进度,能联调的时候就联调,无法联调就完成手头上的其他任务。

可能有些同学初入职场会犯这类错误,做的功能依赖别人,因为别人还没做完,然后就采用第一种做法,一直干等着,直到对方完成后再继续工作。偶尔偷偷懒还行,如果一直是这样的工作状态,对初入职场的同学没有好处,而且这个被老板知道很不好。如果某一个需求点阻塞了,应该就先做手头上其他工作,如果手头上没其他工作,就跟老板反馈情况后领其他任务做,还要时刻去跟进阻塞的需求点的进度。

下面用流程图来描述这 2 个概念:

阻塞

阻塞

非阻塞

非阻塞

看了上面的图,是不是更加理解阻塞与非阻塞了呢?

老板说了算

如果你是老板,或者说是小明的领导,你会让小明怎么做?第一种做法还是第二种做法呢?有支持第一种做法的,麻烦联系我,你们公司还招人么?

推荐阅读

吃个快餐都能学到串行、并行、并发

泡一杯茶,学一学同异步

进程知多少?

设计模式看了又忘,忘了又看?

后台回复『设计模式』可以获取《一故事一设计模式》电子书

觉得文章有用帮忙转发&点赞,多谢朋友们!

LieBrother

吃个快餐都能学到串行、并行、并发

发表于 2019-07-10   |     |   阅读次数

Java 多线程系列文章第 3 篇

这篇文章继续来唠唠概念,讲这三兄弟:串行(Serial)、并行(Parallel)、并发(Concurrent)。

吃快餐

出门在外吃饭是一件头疼的事,用我大学舍友一句话形容:如果不是没吃饭不能活,他是不会吃饭的。不管学生还是工作者,吃饭都是一件需要揪心的事,有食堂的企业员工纠结要在公司食堂吃饭还是在外面吃饭,没食堂的企业员工则纠结是吃面还是吃米饭。每到饭点,和同事去吃饭都会问一句废话:吃啥?然后相视而笑,继续吃快餐。。。

咱吃快餐也能学点知识,我来给大家一一道来。快餐有一个很明显的特点就是:排队!!! 目前我见过的有下面几种排队方式,刚好和咱们今天要讲的串行、并发、并行一一对应。

现在我们公司附近的快餐,人少的时候,就是排一条队,如下图所示,每个人按顺序排,一直往前走,如果看到想吃的菜,就用手指一指,快餐员工就会给你打菜,这个应该是很多快餐店都采用的方式,容易管理,但是有一点需要强调的就是如果一个同学只想吃米饭和豆芽,他还是需要排一整队到最后的结账台结账。这其实就是咱们计算机世界里面的串行,一条队伍,依次有序的执行着。

串行

不过一到 12 点高峰期上面那种排队方式就撑不住了,分分钟排队排到外面晒太阳,这时为了提高效率,因为快餐店还有一片空地,所以又加了一套打菜装备和员工,这时很好的解决了一条队伍太长的问题,这时就是并行了,2 套打菜装备和员工各自互不干涉,完全独立,每套装备能够解决每个顾客的点菜需求。当然这要求比较高,需要餐厅有足够的空间可以放下两套装备,并且需要雇佣多一倍的员工来为顾客打菜,这里就类似计算机的双核。

并行

除了上面的两种快餐排队方式,还见过下面这种的,只有一套打菜装备,但是却有很多个队,每个菜排一条队(现实中其实不止一个菜,而是多个菜,这里画图就简化成一个菜),每个人就只需要排自己想吃的菜的队伍,这一道道菜就像计算机的各个资源,比如 CPU、IO 等等,人就像一个一个进程,有些只需要 CPU 计算资源,有些还要 IO 资源,各取所需,这种方式就是并发。这种打菜方式和上面第一种所需要的资源是一样的:一套打菜装备和员工。每个顾客最终都需要走到结账这个步骤,而结账只有一个,也就是类似计算机的单核。

并发

总结

那么回归到计算机世界,这三者是什么东西呢?早期计算机只有一个 CPU,也就是所谓的单核计算机,只有一个 CPU 去执行任务,所以只能是一个任务一个任务的跑,每个任务跑完才让下一个任务跑,也就是串行的,后面因为进程和线程概念的提出与实现,它们使得任务以进程的方式运行,拆分成多个时间片运行,而不是一次运行执行完任务,这样子在一个 CPU 运行中可以有多个任务在并发执行,这时还是只有一个 CPU,一个时间点只有一个任务在执行,而并行是因为 CPU 硬件的发展,出现多核 CPU,所以实现了真正的同一时间点能有多个任务在执行。

上面用快餐排队现象给大家解释了串行、并行、并发这三个概念,大家理解了么?如果不理解可能是我讲得不够透彻,可以留言跟我提一提建议;如果理解了,可否帮忙转发一下,多谢啦!

推荐阅读

泡一杯茶,学一学同异步

进程知多少?

设计模式看了又忘,忘了又看?

后台回复『设计模式』可以获取《一故事一设计模式》电子书

觉得文章有用帮忙转发&点赞,多谢朋友们!

LieBrother

泡一杯茶,学一学同异步

发表于 2019-06-26   |     |   阅读次数

Java 多线程系列文章第 2 篇

接下来几篇会给大家屡清楚多线程中涉及到的一些概念,理解了这些概念,往后的文章才好明白。

今天给大家讲讲同步和异步这兄弟俩。

同步 & 异步

通过咱们现实中的一个场景来描述这 2 个干巴巴的词。大家身边不知道有木有朋友是潮汕的?潮汕地区每家每户都有功夫茶,只要来客人,一定会用功夫茶来招待。功夫茶关键在于功夫两字,功夫指的是泡茶方式比较讲究,它不像咱上班时用保温瓶泡茶,而是有一道泡茶的流程和工具。下面在网上找到的功夫茶口诀(作为潮汕人这么久,都不知道有这口诀,是听我女朋友说有这个口诀才知道。。。)

潮汕功夫茶冲泡口诀:

  1. 白鹤沐浴(洗杯):用开水洗净茶杯并提高茶具温度。
  2. 观音入宫(落茶):把铁观音茶放入茶具,放茶量约占茶具容量的五分。
  3. 悬壶高冲(冲茶):把滚开的水提高冲入茶壶或盖瓯,使茶叶转动。
  4. 春风拂面(刮泡沫):用壶盖或瓯盖轻轻刮去漂浮的白泡沫,使其清新洁净。
  5. 关公巡城(倒茶):把泡一、二分钟后的茶水依次巡回注入并列的茶杯里。
  6. 韩信点兵(点茶):茶水倒到少许时要一点一点均匀地滴到各杯中,使其浓淡均匀。
  7. 鉴尝汤色(看茶):观赏杯中茶水的颜色,闻茶之香气。
  8. 品啜甘霖(喝茶):乘热细缀,先嗅其香,后尝其味,边啜边嗅,浅斟细饮。饮量虽不多,但能齿颊留香,喉底回甘,心旷神怡,别有情趣。

有客人来的时候,我们会先煮水,没等到水煮沸就先洗茶杯,落茶,等到水煮沸了,再冲茶,倒茶。这个过程中,有些步骤是同步的,比如洗茶杯和落茶,肯定要把茶杯先洗干净后再落茶,一个人没法同时干这 2 件事,我们关注点放在煮水这个过程,是先煮水,煮水需要比较长的时间,煮水的过程中把茶杯洗了,还有落茶,这个过程其实就是异步,异步指没有干等待水煮沸,在煮水的过程做其他事情(洗茶杯、落茶),这就像是发送了一个消息,通知说要煮水,然后就继续自己该干嘛干嘛,异步的过程完全不影响当前做的其他事。下图反映了煮水步骤是异步的这个过程。

如果主人用下面方式来泡茶,不是新手就是不欢迎你(开玩笑,有可能是主人一见如故,想趁着煮水和你唠家常)。上面讲了异步泡茶的方式,下面讲同步泡茶是啥回事。看下图,把煮水这个过程放在了时间线下方,也就是在煮水的时候干等着水煮沸,不做其他的事情,这就是同步,很明显,最后整个泡茶的过程耗时比异步的长。

总结

这里在简单总结一下(如有错误请大家帮忙纠正):

同步(Synchronous):特指在同一个线程里面执行的内容之间的关系是有顺序的;线程之间需要同步时,就需要使用一些显式的同步方式,这也是多线程带来的大问题,在多线程编程需要特别关注。

异步(Asynchronous):特指一些执行内容可以不用直接等待运行结果,异步执行的内容一般是在另一个线程运行,只需要运行完结果反馈回来就行。

推荐阅读

进程知多少?

设计模式看了又忘,忘了又看?

后台回复『设计模式』可以获取《一故事一设计模式》电子书

觉得文章有用帮忙转发&点赞,多谢朋友们!

LieBrother

进程知多少?

发表于 2019-06-24   |     |   阅读次数

本文目录

[TOC]

Java 多线程系列文章第 1 篇

要讲线程,一般都得讲一讲进程,进程是何方神圣呢?下面来简单介绍一下。

先通过任务管理器看看 Windows 系统下的进程。

从图片来看,每一个进程都占有 CPU、内存、磁盘、网络等资源。站在操作系统的角度,进程是分配资源的基本单位,也是最小单位。

进程为什么出现?

引入进程的目的:为了使多个程序能并发执行,以提高资源的利用率和系统的吞吐量。怎么理解这句话呢?一个程序在运行过程中会涉及很多操作,利用 CPU 计算、通过磁盘 IO 进行数据传输等等,我们知道当程序在进行磁盘 IO 的时候,因为速度问题,会比较慢,所在在这个过程中 CPU 会空闲下来,这会造成资源的浪费,正因为引入进程,在 A 进程进行磁盘 IO 的时候,会让出 CPU 给 B 进程,合理地利用了 CPU 资源,使得程序之间可以并发执行。

从 CPU 角度,执行过程是这样子的:CPU 一直在负责执行指令,进程之间互相竞争 CPU 资源,下图有 A 和 B 进程,在一个时间点,CPU 只执行一个进程的指令,因为 CPU 运行很快,所以在咱们看起来,像是多个进程在同时跑。这就是进程带来的好处:提高资源利用率,并发地执行多个程序。

当然引入进程也不是有益无害,它增加了系统的时间和空间开销。空间开销这个好理解,进程有自己的组成部分(下面会讲),这个就占用了空间。时间开销则是进程程切换需要时间。

进程的组成

进程由 3 个部分组成,分别是程序代码、数据集、栈和进程控制块(Process Control Block)。

各自的作用如下:

  1. 程序代码:描述了进程需要完成的功能。
  2. 数据集、栈:程序在执行时所需要的数据和工作区。
  3. 进程控制块:包含进程的描述信息和控制信息,它是进程存在的唯一标识。

如何竞争资源(调度算法)

进程之间需要竞争资源,一般都是竞争 CPU 资源,因为 CPU 运行速度太快了,其他介质都赶不上。有了竞争就需要有规则,就像游戏一样,每个游戏都需要规则,不同规则会有不同的侧重点,这个看过“最强大脑”这个节目的朋友就非常清楚,每道题都有不同的考核侧重点,有些是侧重空间思维、有些侧重逻辑推算等等。下面我们就简单地一一讲解竞争资源的游戏规则。

FCFS

First In First Out(先来先服务):最先进入就绪队列的进程,先运行,运行到完成或者阻塞时,再重新调度。一般情况下,这种调度算法会和优先级策略结合,比如每个优先级一条队列,每条队列中的调度都使用 FCFS。

特点:简单、比较偏于长进程、相对于其他调度算法平均周转时间长。

RR

Round Robin(轮转):进程按提交顺序存在就绪队列,依次轮流占用 CPU 资源,运行一段固定的时间,时间到后如果还没执行完,就继续进入就绪队列队尾,排队等待下次执行。

特点:公平、对进程的响应时间较短。

SPN

Shortest Process Next(最短进程优先):将预期占用运行时间最短的进程优先执行,直到运行完成或阻塞时,再重新调度。

特点:有利于短进程。

SRT

Shortest Remaining Time(最短剩余时间优先):新进程进来时,如果新进程的预计运行时间比当前进程的剩余运行时间更短,就抢占当前进程,

特点:有利于短进程,和 SPN 的差别在于抢占这个一点,因为抢占,所以效率会比 SPN 好一些。

HRRN

Highest Response Ratio Next(最高响应比优先):当前运行的进程完成或者阻塞时发生调度,每次调度前,计算所有就绪进程的响应比,响应比高的进程优先运行。

响应比公式如下所示:

特点:有利于短进程,服务时间相同的进程,先来的服务会优先执行,长进程因为在等待的过程中,优先级越来越高,所以不会一直不执行。

FB

Feedback (反馈):由多个就绪队列组成的反馈机制,它有如下规则:

  1. 在同一个队列的进程,按 FCFS 算法调度,最后一个就绪队列按 RR 算法调度;
  2. 优先级越高的队列,时间片越小;
  3. 进程在一个时间片内未运行完,则降到下一个队列末尾;
  4. 只有上级队列无就绪进程时,才运行本级就绪队列,本级就绪队列无进程时,才运行下级就绪队列,以此类推

进程执行过程如下图所示

特点:短进程有非常大的优势,排在前面的队列都是时间较短的。

以上就是几个抢占资源的调度算法的说明。

进程状态

上面我们讲到,进程之间是在竞争资源,得到资源就运行,没得到就等待,这个需要有状态来维护,像很多系统一样,需要一个状态机。

三态图

三态图也是描述进程状态最简单最基础的图,它包含了进程的最基本的 3 个状态,分别是:就绪态、运行态和阻塞态。

Read(就绪态):进程已得到除 CPU 以外的其他所需资源。
Running(运行态):进程的指令正被执行。
Blocked(阻塞态):进程正等待资源或某事件发生。

进程三态图

就绪态的进程在被调度的时候,进入了运行态,如果时间片运行完或者有更高级别进程抢占资源,则变成就绪态等待再次被调度;如果发生事件(比如 IO 事件),则从运行态转到阻塞态,进入阻塞态的进程只能等待事件解除重新进入就绪态。

五态图

基于三态图,新增了 2 个状态,分别是:新建态和退出态。

New(新建态):进程正被创建。分配内存后将被设为就绪态。

Exit(退出态):进程已正常结束或出现异常结束。回收资源。

进程五态图

新进程刚创建还没有分配资源的时候是新建态,等到分配了资源,被加载后就进入就绪态。当进程运行完后,就从运行态进入退出态。

七态图

基于五态图,新增了 2 种挂起态,分别是就绪挂起态和阻塞挂起态。

就绪挂起态:另叫外存就绪态。由于内存容量有限,将原位于内存的就绪进程转存到外存(磁盘)上。

阻塞挂起态:另叫外存阻塞态。一样因为内存容量有限,将原位于内存的阻塞进程转存到外存(磁盘)上。

七态图

我们可以看出,图中新增了解除挂起的状态转换过程,一般是由于挂起进程优先级比较高或者内存空间足够,把位于外存(磁盘)的进程转存到内存中。

进程关系

进程之间其实比较独立,比如我们在日常使用的 QQ 和微信,它们运行起来的进程有什么关系么?其实除了互相竞争资源之外,没有任何关系。

父子关系

虽然上面说的进程之间没有关系,但是有一个特殊关系需要讲,就是父子关系。

先做个试验,验证进程的父子关系。操作步骤:

  1. 打开 CMD 命令行程序,将当前的窗口设置为 Father,在 Father 窗口通过命令start cmd启动另一个 CMD 命令行程序;
  2. 将新开的 CMD 命令行程序的窗口设置为 Son,在 Son 窗口通过命令start cmd启动另一个 CMD 命令行程序;
  3. 将新开的 CMD 命令行程序的窗口设置为 Grandson。

操作过程如下图所示。

通过 ProcessExplorer 可以很清晰看到这 3 个 CMD 进程之间的关系。(想要 ProcessExplorer 插件可以通过百度网盘下载链接:https://pan.baidu.com/s/19531gf5tD_of1CWxpFR9Dg 提取码:qhc6)

我们看到 Father、Son、Grandson 三个进程呈现出我们预料中的树形。那么什么是父子进程呢?简单的说就是在进程中创建出新的进程,这个新的进程就是子进程,一个进程可以有多个子进程,但是只能有一个父进程。在 Unix 系统中,父进程通过调用 fork() 创建子进程,父子进程有如下特点:

  1. 父、子进程并发执行;
  2. 父、子进程共享父进程的所有资源;
  3. 子进程复制父进程的地址空间,甚至有相同的正文段和程序计数器 PC 值;
  4. 利用写时复制(Copy On Write)技术减少不必要的复制:fork 时父子共用父空间,当一方试图修改时才复制。

这里重点讲一下Copy On Write,使用了这个技术,父进程创建子进程的时候不会复制所有数据到子进程,省了复制的时间以及减少了大量的内存。这个复制不是必要的,因为如果应用程序在进程复制之后立即加载新程序,那之前的复制工作就是浪费时间和内存了。

讲了进程父子关系,就免不了提一下僵尸进程和孤儿进程,下面分别介绍一下。

僵尸进程

僵尸进程:子进程退出后,父进程没有调用 wait 或 waitpid 获取子进程的状态信息,子进程的进程描述符仍保存在系统中,这种进程叫僵尸进程。

僵尸进程的危害:僵尸进程会一直占用进程号,系统能使用的进程号又是有限的,如果有大量的僵尸进程,会因为没有可用进程号导致无法创建新的进程。

孤儿进程

孤儿进程:父进程结束退出,而它的子进程还在运行,这时的子进程就叫做孤儿进程。孤儿进程就被 init 进程(进程号为 1)收养,init 进程将对孤儿进程完成状态收集工作。

孤儿进程没有危害,因为被 init 进程托管了,init 进程会处理孤儿进程的收集工作。

执行模式

指令分为特权指令(只能由操作系统内核使用的指令)和非特权指令(只能由用户程序使用的指令),因为指令有特权和非特权之分,所以 CPU 也分为 2 种执行模式:系统态(可以执行所有指令,使用所有资源以及改变 CPU 状态)和用户态(只能执行非特权指令)。

CPU 的系统态和用户态之间的切换。

进程间通讯

当进程之间需要数据传输、共享数据时,进程间就需要互相通讯,通讯方式有如下几种,这里只是简单概括一下,不展开讲,咱的重点在于多线程,进程咱们简单了解一下就可以,感兴趣的同学可以根据要点进行深入学习。

管道(Pipe)

管道是半双工通讯,数据是单向流动,要建立进程间互相通讯,则需要 2 个管道,这种通讯方式只能在亲戚关系的进程间使用,比如父子进程。

流管道(Flow Pipe)

流管道是管道进化来的,数据不再是单向流动,可以双向流动,但是依旧是只能在亲戚关系的进程间使用。

有名管道(Named Pipe)

有名管道提供了新的功能,就是给管道设置名字,它改善了上面 2 种管道通讯方式,支持了非亲戚关系的进程通讯。

信号量(Semophore)

信号量相当于计数器,利用它来控制多个进程访问共享资源,当一个进程A在访问共享资源时,信号量防止其他进程来访问,只有当进程A不访问共享资源了,其他进程才能访问。

信号(Signal)

信号可以在任何时候发给某一进程,不需要知道该进程当前的状态,如果对方进程未执行,信号会存在内核中,直到进程执行后传递给它;如果对方进程是阻塞,则信号会延迟传递,等到对方进程阻塞取消后才传递给它。

消息队列(Message Queue)

消息队列是存放在内核中的链表,可以有多个进程对这个链表进行写入和读取,它解决了信号传递信息少、管道只能传输无格式字节流和缓冲区大小受限的缺点。目前有 POSIX 消息队列和 System V 消息队列。

共享内存(Shared Memory)

共享内存即为一段能被其他进程访问的内存,多个进程访问同一个内存,达到了通讯的效果。

套接字(Socket)

套接字就是我们网络编程里面的那个套接字,可以通过网络也可以在本机进行通信,它的好处在于可以跨主机进行通信。

总结

总的来说,进程是程序在一个数据集上的一次执行过程,它就是程序运行起来的表现。这是我们学习多线程的开篇,希望通过这篇文章,让大家简单地了解进程是什么,后面我们再来深入了解多线程。

推荐阅读

设计模式看了又忘,忘了又看?

后台回复『设计模式』可以获取《一故事一设计模式》电子书

觉得文章有用帮忙转发&点赞,多谢朋友们!

LieBrother

接下来。。。

发表于 2019-06-10   |     |   阅读次数

谈谈接下来的安排。

许久没更技术文章,大家关注这个号大多数是因为《一故事一设计模式》这一系列的文章,而这一系列的文章已经告一段落,也做成电子书分享给大家。

出书看法

有朋友让我再整理整理出成书,其实很久前就有不少图书编辑找我出书这件事,下面截几条留言图。

我现在对于出书的看法:不到时候。我也很羡慕很多公众号大佬和博客大佬出书,出完书后个人的 IP 得到了很大的提升,但是当我去看他们的公众号、博客的时候,我知道他们从开始写文章到出书,经历了很多、也沉淀了很多,这一路是需要去经历的。也许有人觉得人生可以跳跃,因为读书可以跳级,但是跳级的本质是因为他提前学习了他同龄人中没学习过的高年级知识、提前掌握了这些知识点,他比同龄人经历得多,在我们外人看来是跳跃,在他们眼里,只是走得快,其实应该纠正我们这个“跳跃”的看法。因此,通过这些事情认知自己,明白自己几分几两,也不难做出暂不出书的决定。

打从心里,当第一次有人找我出书的时候,那兴奋劲估计这辈子忘不了,但是我希望后面有更多兴奋的事情来冲淡那股兴奋劲,这就需要我去更努力提高能力和服务大家。

话又说回来,我自己整理成电子书,也可以算是出书吧,哈哈哈,当然和出版书还是有些区别,就是不赚钱。

下面说一下和标题有点关系的事。。。

写系列文原因

这段时间在寻思写下个系列的文章,为什么我钟情于系列文?原因如下:

  1. 以点成面。这几年学习过程中,涉及了很多个点,但是从没把点连成线、甚至成面,想通过公众号文章分享,把零散的点连起来成为面。
  2. 训练思维。第一点的以点成面说起来很简单,其实这里面涉及到很多思维的东西,任何事物要有关系(连成线)都需要隐含的逻辑,所以想通过写系列文来训练这个思维。
  3. 为以后出书做好基础。出书是结果,写书是过程。先练习写书,写书的过程需要去深入了解当前市面上与所写书籍相似的图书,这个过程也是我在写系列文章中需要学习的。
  4. 给读者一套有始有终的文章(最重要的一点)。每个公众号的定位不同,写作也不相同,我想给读者提供系统性的文章,最好就是由浅入深的系列文章。

接下来安排

接下来。。。准备写的系列文章是:Java 多线程。这个系列文章和设计模式系列还有些不同,设计模式每篇文章比较独立,而Java 多线程知识点由浅入深,有先有后,需要循序渐进,对我来说是一个蛮大的挑战,需要花很多精力去学习这些知识点的深浅前后顺序,但我喜欢这个挑战,希望能给大家带来不错的文章。

已经找到了 7 本 Java 多线程方面的书籍,这些书籍以及网上一些优秀的博客将是接下来系列文章的输入,我会通过学习这些知识,经过思考,输出文章给大家。目前看了这几本书的目录,简单记录了一些知识点(还没做知识点深浅分析),如下图所示,接下来会围绕这些知识点来写文章,这些知识点有些在这本书有、有些在那本书有,没有一本能够完全覆盖,这系列文章希望提供一份比较全的 Java 多线程知识点

致读者

首先感谢大家对之前《一故事一设计模式》系列文章的支持,谢谢大家认可我写的挫文。

其次我不是大佬或什么大神哈。我也是在学习,也没有非常多的经历,包括设计模式系列文章,是我在学习后,加入了一些思考,结合工作中运用到设计模式的代码,然后写成文章,分享给大家,不是什么十几年经验丰富的老司机,所以文章会有不少错误,大家看到有啥错误记得反馈给我,对我来说也是一次成长的机会。

最后,写作是一个漫长并且“煎熬”(特别是原创)的过程,希望大家多多帮忙分享文章,点个『在看』以资鼓励。

就是干

一起期待下个系列的文章!

推荐阅读:

设计模式看了又忘,忘了又看?

公众号后台回复『设计模式』可以获取《一故事一设计模式》电子书

LieBrother

1234…24
LieBrother

LieBrother

当才华撑不起野心时,应该静下心来学习;当能力驾驭不了目标时,应该沉下心来历练。

120 日志
38 分类
138 标签
© 2016 - 2019 LieBrother
由 Hexo 强力驱动
主题 - NexT.Mist
本站访客数人次  |  本站总访问量次