Java并发学习 类FutureTask分析与改进

大约两个月没有写博客了,原因是最近自己一直在看《The Art of Multiprocessor Programming》。这本书从理论到实践介绍了多核编程,给出的数据结构和算法都有相应的论文。如果你想好好学习多核编程,而不是某种语言的并发机制介绍的话,非常推荐这本书。同时这本书里介绍的算法,在Java的并发库里面都能找到影子。作为继续深入学习的一部分,个人打算逐个分析典型的并发类,并且基于个人理解给出一些改进或者变化。

Java的并发库里面,从版本1.5(Java 5)开始引入了接口Future和实现类FutureTask。与其他Synchronizer(同步类)不同,FutureTask并没有依赖AQS,所以是相对简单的一个并发类。FutureTask包含执行Task和同步结果两块主要功能。这里主要分析如何同步结果。

注意,本文并不会逐行代码分析FutureTask。为了学习如何设计并发类,本文以个人理解的原型类开始,逐渐修改成为接近实际FutureTask甚至超过FutureTask的代码。

Read More

给开始在日本学习生活的人的一点参考:在日本看病(2)

上篇大致讲了一下在日本看病的常识。小毛小病在诊所能解决掉是最好的,不过有些必须去医院,比如我昨天做的拔智齿的手术。

本文主要是记录自己拔智齿的前后过程,顺带讲一下医院与诊所的不同。

前篇中也提到过,如果直接去医院,也就是是紹介状なし(しょうかいじょうなし,没有介绍信)的情况下去的话,会收额外的一笔不少的费用。所以建议先在诊所看病,如果不行的话,可以让诊所开介绍信,你再去医院。

这次我就是親知らずの抜歯(おやしらずのばっし、拔智齿),需要动手术,歯科(しか、牙科)帮忙开了介绍信。注意开介绍信也是要费用的,但是比没介绍信直接去医院要便宜。我拿到的介绍信是一个信封,上面给你指定了医院,科室和医生。信封里面的内容我没有确认,估计就是你在这家诊所的病例卡。

Read More

给开始在日本学习工作的人的一点参考:在日本看病(1)

最近到医院预约了拔智齿,突然想到对于一个到了人生地不熟的日本,而且不喜欢抱团的人来说,如何在日本学习或者工作的同时看病是一个很大的难题。语言是一方面,日本和国内大相径庭的看病方式也需要时间适应。所以,考虑了下,分享顺便也记录下自己的看病经历。

到现在为止,个人经历过的主要是皮肤科(皮膚科、ひふか),牙医(歯科、しか)。个人体质原因,不大感冒,没去过耳鼻咽喉科(耳鼻咽喉科、じびいんこうか)。不过今年春天好像得了花粉症(花粉症、かふんしょう),可能之后会去。

和国内不同,小毛小病这边不会去医院(病院、びょういん),而是先去诊所(クリニック)。直接去医院的话,会额外收一笔费用,而且你会等很长时间。

Read More

登山笔记・关于登山

随便聊一下「登山」这个概念。

比如说珠穆朗玛(8848m)和上海佘山(100m)同样是山,但爬这两座山是完全两个概念。

日语环境里,「登山(とざん)」是个大概念,去高尾山(599m)也是登山,去富士山(3776m)也是登山。

之前心血来潮查过知乎,好像在中国国内,普遍把徒步和登山的概念以山的高度作为区分,4km以上算登山但4km以下就只能划作徒步。不是很清楚这样划分的意义,但这种划分总让人觉得登山是专业的事情,不是普通人可以做的,门槛很高。

在日语环境下,登山便没有那么高的门槛。原先我也有芥蒂,都说自己是去徒步(hiking),同事们却听得一愣一愣的,反问你不是去登山了吗。后来想想确实没必要在自己内部划分这些,开心就好。

纵走(縦走)也好,徒步(ハイキング)也好,trekking(トレッキング)也好,划分的那么清楚自己心也累。

反正就是早起赶早班电车电车下来开始走,走到目的地偶尔住一天,绝大多数时候是休息片刻便立即动身,下山或者走向另一个山头。
回程累了电车上偶尔小睡30分钟。
回家泡个澡倒头就睡做个还在山上走的梦。
第二天起来享受着肌肉酸痛重新回归毫无偏离的日常生活。

自适应分布式速率限制(distributed rate limiter)

本文是针对xratelimiter的算法说明。

https://github.com/xnnyygn/xratelimiter

首先对rate limiter做一下简单介绍。

rate limiter主要用在限流,比如希望网站的访问在一定的量的时候,对于API有调用量限制,作为云服务商限制访问用户网站的流量等等。

常见的rate limiter算法有token bucket。具体算法这里不作展开。一般实现中,会有一个记录最后添加了token的时间戳,还有一个记录当前token数的变量。由于有两个变量,在使用redis实现集中式的token bucket时无法原子修改。

Read More

基于GOSSIP的集群成员管理-成员的加入和退出

本文是对于以下项目的算法说明。

https://github.com/xnnyygn/xgossip

首先简单介绍一下GOSSIP。

GOSSIP据说最早见于论文《Epidemic Algorithms for Replicated  Database Maintenance》,对于GOSSIP有兴趣的人建议阅读一下此论文。

GOSSIP算法如论文标题是一种epidemic algorithm,可以理解为传染病的传播。有三个人A,B,C。A是传染源,当A传染给B,B传染给C之后,所有人都被传染了。在分布式系统中,可以把传染病类比为更新,当所有参与的节点都获取到了更新之后,集群达到最终一致状态。从这个角度来说,GOSSIP是一种弱一致性,或者说最终一致性算法。

Read More

Raft实现笔记-日志结构

本系列是在实现了绝大部分raft论文中描述的功能之后实现过程中遇到的问题,设计的决策等的记录。随着功能的增减,项目的逐渐完善,系统中的实现笔记可能会有偏差,但是基本上对于第一次实现或者想要理解raft的人来说可以作为一个参考。

本篇是针对0.1.0版本xraft,0.1.0之后的版本可能会有所变化。

Read More

登山笔记(序)向山进发

从小到大没爬过几次山。

印象里最深的是小时候春秋游去过南昌梅岭和三清山,高中时浙江仙居上海佘山和大学里暑期调研的泰山。但这些都是旅游景点并非所谓的山,我甚至说不出这些景点内山的名字。想去爬山玩?门票价格摆在那里。所以从来没有对登山产生过兴趣。

然而看过ヤマノススメ后才知道在日本登山是用不收门票钱的。
刚来日本半年后某个周末的上午躺在地上,想想自己一个人平时周末除了打游戏就是看动画,不如出去走走。然后就穿上普通运动鞋和轻便的服装开始了场圣地巡礼。

高尾山,来日本旅游的话绝对推荐去走一圈的山,在东京都内交通方便。没有登山装备可以简单从一号路的水泥路上去,想体验水路的可以走走六号路。
高尾山附近一带大多是这类泥地的山,适合散心。想稍微锻炼一下体力的则可以往丹沢箱根方向走。
不知不觉已经走过了很多地方,不知不觉买了一堆户外用品。留下一堆遗憾和一堆回忆。
不知道什么时候能去長野県来一圈纵走,或者在山上搭个帐篷看星空。如果养了阿猫阿狗的话,好想带着它们去爬山。
爬山回来后洗个澡睡的像猪一样,闭上眼睛就能看到满是石头的地面,好像还在摇头晃脑走着山路一样。

希望今年能在富士山上看到御来光。

Raft实现笔记-开篇

本系列是在实现了绝大部分raft论文中描述的功能之后实现过程中遇到的问题,设计的决策等的记录。随着功能的增减,项目的逐渐完善,系统中的实现笔记可能会有偏差,但是基本上对于第一次实现或者想要理解raft的人来说可以作为一个参考。

现在,2018-08-09已经实现的功能

  • leader election + log replication
  • membership change(one server change)
  • log compaction(snapshot)

Read More