《Java 9 Concurrency Cookbook》阅读小结

每次我看书都是有“冲动”的缘由的,这次看这本书也不例外。客观上讲作为一名Java程序员,如果一开始就上来看java多线程,java并发编程很可能会打击你的信心,我记得我很久之前就买过一本关于java多线程编程的纸质书——《Java并发编程实战》

这本书我当时看了一点点就基本上放弃了,不是我觉得这本书写得不好,而是我实在没有办法看完,因为里面有太多的东西,我都没有见过。所以很长时间以来,我觉得那个多线程编程很高级,别人一谈及“高并发,线程安全”等等问题,我都也只是听一听,略当了解。

其实在技术道路上我也有自己的箴言——你不知道那门技术,那是因为那门技术蒙了一层面纱,学习新技术就是揭开面纱的过程。这是一种乐观的心态,因为总是有“谣言”说学习是一件痛苦的事情,学习是件寂寞的事情。而我们的乐观心态会促使我们有一种新的体验——就像过去新郎揭开新娘的面纱一样,我们是拥有着激动的心颤抖的手的状态,热烈而好奇,紧张而激动,期待着美好。

然而时间还是悄悄地过去了3年,这段时间我开始接触到了Java多线程编程,还有就是经常听到的“高并发”,其实除了在API层或者在网关层我们使用一些技术去应对高并发,在java层面我们写的Java业务代码也是需要应对高并发,实现多线程编程的。尽管java一直在简化我们多线程编程的难度,但是我们作为Java多线程编程的学习者和实践者,我们还是需要了解一下整个Java多线程技术的发展史和体系结构。

也是机缘巧合,我看了这本《Packt.Java.9.Concurrency.Cookbook.2nd.Edition.2017.4》

之前的那本《 Java并发编程实战 》我借给之前的同事看了,然后我就网上找原版的(最近一直在看英文版技术书),找是找到了结果由于排版问题看得比较不是很舒服,我就偶然搜索到上面这本书。本来是想着看看写的怎么样,之前我看的英文书主要是O’Reilly 或者Manning出版的,这次是第一次看Packt出版的书。

这本书的写作风格大致是分5步讲一个Recipe
Getting ready
How to do it…
How it works…
There’s more…
See also
看起来排版清楚,组织合理,而且还是讲代码的,中间会穿插对代码的解释。所以一路看下来也是水到渠成的,很自然,就没有想过要中途放弃。最后我也是把里面的代码看完了然后”native”了一下上传到了github上。

总体而言,这本书还是很值得读一下的。我结合我自己的理解先说说java多线程开发的历史。

在Java 1.0就引入线程Thread类、 Runnable接口,然后Java 到了1.5时,Java迎来一个值得历史纪念版本Java 1.5, 在这本版本中多线程编程就简化了很多,提供了很多了工具类或者说是底层代码。之前多线程编程时经常需要使用到synchronized关键字,然后就是从Object中继承过来的wait(), notify(),notifyAll(),现在有了轻量级的同步机制volatile关键字,还有整个juc(java.util.concurrent)包。当然juc里面还分了atomic和locks子包。Lock(锁机制就是这时候引入的),还有我们说的AtomicInteger(原子整数),支持原子操作,对应的是我们常看见的i++。同时还引入了阻塞队列、并发集合、线程池。然后Java到了 1.7时,又引入了一个新的Fork/Join 框架,然而如果你不了解juc,你可能也就只是停留在听说过这个词,最多知道这个框架是把任务大的化为小的,如果还是大了,就再化小,依次进行。然后Java到了 1.8(以后都叫java 8\ java 9\ java 10 …), java进一步简化并发编程,引入Stream,同时开启多线程处理的任务就“简单”了很多,在API调用层面,基本上看不到线程/线程池/同步/锁等等一些列“底层”的东西,我们只需要”简单”地调用一下parallel()就可以并行地去处理任务。然后到了java 9, 又引入了一个VarHandle,可能你没有直接用过。

这段简史我虽然只用了一段文字来概括,因为里面的内容很多,随便挑一个估计都会说上半天。

我们在来总览一下这边本书——
《Packt.Java.9.Concurrency.Cookbook.2nd.Edition.2017.4 》,我们可以先看一下目录

一共分了11章:
第一章:线程管理
第二章:基本线程同步
第三章:线程同步工具类
第四章:线程执行器
第五章:Fork/Join 框架
第六章:并行和响应式流
第七章:并发集合
第八章:定制并发类
第九章:测试并发应用
第十章:额外信息
第十一章:并发编程设计

上面的内容组织也基本上是按照我之前提到的java中多线程编程的发展历史一一展开的除了把并发集合放到了后面。这本书主要是讲应用和概念,所以在深度上不是特别投入,但是足够你了解juc,让你揭开这层面纱。

看完之后我们对java中juc这个包以及里面的绝大数的类有一个认识,但是在实际工作中我们可能会遇到一些应用上的问题,这些书只是一个理论基础,包括其中的源码也是一样。

我们先简单看一下juc包

这是总览,再看一下atomic子包

最后看一下locks子包

看完这本书后,就不会对juc这个包下这么多的类和接口感到陌生了,更多了应该是熟悉,因为基本上都直接或者间接用过一边了。我们现在可以这么看,先看接口,然后再看实现类就比较清晰了。

先看这张基本图:

由于之前是 Runnable ,没有返回值,现在是 Callable 带有返回值T,所以在上面的图中我把FutureTask显示出来,这样就体现 了对Thread扩展开放。

再看一张关于并发集合的图:

再瞄一眼一个有趣的类的层次结构:

关于线程池我们也可以看一眼:

记在最后:看完全书,你会有一个比较好的总览概念,就像juc的鸟瞰图一样,当然这是并发编程的一个偏介绍性知识,还有很多比较深的东西,比如原理之类的,还是需要深入到源码层面和实际工作的应用才会有更深的体会。
流年笑掷,未来可期

《Neo4j In Action》阅读小结

这本书是2014年出版的,当时Neo4j的主要版本还是2.0,现在Neo4J已经发展到了4.0,我起初看这本书是因为我一直比较喜欢那种关系网的数据展示,比如王者荣耀中就有那种人物关系网,用图展示数据的方式很直观。同时还有社交网络这个经典应用,还有这个贯穿全书的例子电影爱好者movie-lover.

作为程序员我们更希望一上来就可以用代码说话,这本书也是基本上满足了我们的这个小小愿望,尽管在代码的体现上有一些久远,这些代码在github也是有的,所以在书本中基本上是最“主要”的代码,省略了很多,所以你要是想一上来就按照书本上的代码敲一通,显然这个路比较坎坷。当然边看边敲代码算是实践中的一个重要环节,还有一个方面就是理解核心的概念,这本书显然做到了,关于neo4j你能看到节点、属性、关系这个三个核心概念。关于映射到我们编程建模的视角我们更希望看到符合我们胃口的东西。这本书还是选择了核心的API来实现,这一点我在看完书之后发线也没有错,毕竟这是比较底层的东西,也是不上来就整一个Spring Data Neo4j,在习惯了java企业应用开发,站在实用性和功能性上讲,我更希望它早点介绍,然而它被安排到了第九章。所以在此之前我希望你如果看本书的话,要了解这一点,因为它还有更重要的东西需要介绍,毕竟美好的东西都是值得等待的。

除了上面使用java建模来表示这个movie-lover项目,我们还会陆续学习遍历API,这里我们会重新温习一下深度优先和广度优先的算法,这一点我很欣慰。然后就是关于索引,这一点我也不是很惊讶。

然后就是我要重点“表扬”的——Cypher,这是讲得比《Oreilly Graph Databases》好的,你知道了怎么用它去创建节点,属性,关系,然后就是用它来遍历,查询,有点像SQL,但是语法上有些许不同。其实这一点在你安装了Neo4j后,它也会有一个例子Movie Graph,在这个例子中你也能学到怎么使用Cypher,不过先看看规范和说明总不是坏的。接下来Neo4j吹嘘的就是它支持事务,趁此机会你又可以把ACID温故一遍。接下去的就是关于遍历的更高级一点的东西——扩展。

最后一部分更倾向于维护安装等操作问题,当然它也很坦诚还有两个方面没有涉及到一个是安全,另一个就是监控。关于Neo4j数据库的知识至此介绍完了。总体来讲,尽管叫做In Action,我觉得叫做入门还是可以的。毕竟Neo4j的面纱已经揭开,剩下的就是可以参照官网,文档还是很全面的。 https://neo4j.com/


到此,关于看的内容我基本上说完了,剩下的我就是要记录一下关于我的实战In Action方面的事的,这毕竟是从看这本书触发的。

首先就是用Spring Data Neo4j来建模写写代码,我更喜欢用Spring boot项目来做载体,这个项目我放在了github上。然后就是在IDEA 中的编程体验,首先Cypher编辑器还是不错的。但是可视化方面还是不及web版的,所以查询出来的图的结果还是web版好看。所以这一点又引发了我思考,在怎么表示图的数据结构,json方式,web能理解吗?显然是能的,不然它是怎么展示下面的内容的。

但是这还是不够的,我们的一般web应用是不知道怎么实现的,所以我再次想到了Echarts,显然也没有让我失望,我在官网找到了:

我对比了一下数据结构,java原始的json结构是需要一下修改来实现Echart的图的数据需求的,这一点在github中的项目中也是可以看到的。

记在最后,作为NoSQL的一员,Neo4j在表示图的领域还是很有潜力,而且显示世界中图的模型也是有不少的,尽管习惯了关系型数据库的我们,让我们用图来重构经典的基于角色的权限模型,一下子就想到了五张表,然后在图的世界中没有表的概念,实现访问控制它只需要节点、属性和关系来实现,它的查询也不需要像关系型数据例如mysql那样需要联表查询,所以它讽刺了一下关系型数据库却是很难表示关系的。现在阅读这本书算是对图数据的一个基本储备,如果没有接触到图的编程场景,要想很好地掌握还是需要不少时间去实践的,但是我们不慌,因为我们相信——Future is better!

《Kubernetes In Action》阅读小结

说起看一本书,了解一个新词汇,掌握一门新技术,总是要有契机的。毕竟新的事物的接收和消化对于我们很多人而言不是那么平滑,尽管我们对外宣称年轻的我们乐于接受新鲜事物。我当时去看这本书的原因是因为我看了另一本书——《Kubernetes 权威指南》,这本书我现在只看了前面一点点,具体到我只看到了Kubernetes的发展历史,或者说是发家历史。这一点我非常喜欢这本书中描述的故事,将清楚了Kubernetes的“恩怨情仇”,像小说一样的开局还是很吸引人的。而且我一直喜欢别人讲技术的时候,提一提它的历史。但是我当时没有看下去的原因是接下来的很多文字和源码的原因,最主要的是源码,我不喜欢一直看,毕竟只看不写点东西是不容易入门一种新技术的,所以我转向了这本书——《Kubernetes In Action》.

这本书到现在,我除了4个副录没有看,基本上看完了,包括后记。总体来说是一本写得很好的书,首先整本书看下来会对作者组织能力很欣赏,他把Kubernetes由基础到高级知识,或者说是内部实现细节娓娓道来。这本书也是围绕着一个“简单”的例子Kubia展开。从最开始的总览到到核心概念:Pod,Replication Controller,Service,Volume,ConfigMap,Secrets,Deployment,StatefulSet. 第三部分讲到“高级”的概念Service Account, Pod的资源管理,自动化伸缩Pod和节点,高级调度,最佳实践及Kubernetes扩展.作为一名java开发者最受益的地方估计是Kubernetes的最佳实践,毕竟时下微服务很火。在最佳实践章节中,我印象很深的有2点:(1)一个就是关于并发编程中经常取cpu的核数作为并发线程数,在这里我们学了一课,并不是所有的情况都是这样的,在Kubernetes中cpu的核数还受到资源限制的约束,不然你所取到的cpu核数不是真正的cpu核数。(2)另一点就是关于docker镜像打标签问题,尤其是打latest标签,有可能在Replicas中运行的是几个不同版本的代码。

最后可以提及的是后记,这本书很适合有一定基础的Docker用户看,我在看这本书的时候,脑海里也是时常想起Docker中的一些概念,比如在本书中讲到容器启动依赖的时候,我就会想起docker-compose中是如何实现这一点的。如果说Docker带领我们进入了容器时代,k8s可以说是容器时代的“掌舵人”,它在引领着前进方向。当你看了Docker的相关书籍,你或许可以尝试一下这本书,它不会让你失望。毕竟曾经你或许有过迷惑——怎么发布你的应用,green blue部署还是滚动升级Rollout Upgrate,还有就是声明式部署,不是一行行shell命令敲下去。如果你有这样的疑惑,我想再次向你推荐这本书。

小小福利:kubernetes 正确的发音是[kubə’netis],重音在第三个音节 。

链接:https://pan.baidu.com/s/1zgaUMOVQj0qxA5jLE7qtkw
提取码:sfzy

补充一点:如果你使用的是windows 10 ,也是尝试使用Minikube作为实验环境,但是就是建不好环境,我希望你可以尝试一下kind